artur99

Untitled

Jan 24th, 2020
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int char_to_digit(char x) {
  5.     if(x >= '0' && x <= '9')
  6.         return x - '0';
  7.  
  8.     if(x >= 'a' && x <= 'f')
  9.         return 10 + x - 'a';
  10.  
  11.     return 0;
  12. }
  13.  
  14. int parse_base(char str[], int s_i, int s_e, int base = 10) {
  15.     int i, cif, nr = 0;
  16.  
  17.     for(i = s_i; i < s_e; i++) {
  18.         nr = nr * base + char_to_digit(str[i]);
  19.     }
  20.     return nr;
  21. }
  22.  
  23. int main(){
  24.     char s[] = "105 117 20 163 117 6e 164 32 20 163 116 75 144 101 6e 164\n";
  25.  
  26.     int i;
  27.     int s_i = 0;
  28.     int e_i = 0;
  29.     int nr_num = 0;
  30.     int base;
  31.     char decoded_char;
  32.  
  33.     while(1) {
  34.  
  35.         while(s[e_i] != ' ' && s[e_i] != NULL && s[e_i] != '\n') {
  36.             e_i ++;
  37.         }
  38.         // Gata, am mers până când e_i e primul spațiu (sau enter sau capăt).
  39.         // Deci numărul începe de la s_i până la e_i
  40.  
  41.         // Acum trebuie să încercăm să-l decodăm
  42.  
  43.         if(nr_num % 3 == 0) base = 8;
  44.         else if(nr_num % 3 == 1) base = 10;
  45.         else base = 16;
  46.  
  47.         // Luăm numărul decodat și îl punem într-un char
  48.         // (deci va fi interpretat ca un caracter)
  49.         decoded_char = parse_base(s, s_i, e_i, base);
  50.  
  51.         // Îl afișăm
  52.         printf("%c", decoded_char);
  53.  
  54.         // Dacă am ajuns la \n sau la NULL, s-a terminat linia
  55.         if(s[e_i] == '\n' || s[e_i] == NULL) break;
  56.  
  57.         // Dacă nu, trecem la următorul număr
  58.         s_i = e_i + 1;
  59.         e_i = s_i;
  60.         nr_num += 1;
  61.     }
  62.     printf("\n");
  63.  
  64. }
Add Comment
Please, Sign In to add comment