Advertisement
PaulPaulAga

Untitled

Feb 24th, 2021
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <iostream>  
  2.  
  3. using namespace std;  
  4.  
  5. #define MAX_BUFFER 1024  
  6.  
  7. int hex_to_dec(char c) 
  8. { 
  9.     if ((c >= '0') && (c <= '9')) 
  10.         return c - 48; 
  11.     if ((c >= 'A') && (c <= 'F')) 
  12.         return c - 55; 
  13.     if ((c >= 'a') && (c <= 'f')) 
  14.         return c - 87; 
  15.  
  16.     /// В каком случае напечатается это сообщение об ошибке? 
  17.     cerr << "Error!" << endl; 
  18.     return 0; 
  19. }
  20.  
  21. char parse_char(string str, int i) 
  22. { 
  23.     return (hex_to_dec(str[i]) << 4) + hex_to_dec(str[i + 1]); 
  24. } 
  25.  
  26. string decode(string str) { 
  27.     string res = "";
  28.     unsigned int i = 0;  
  29.     while (i < str.size()) { 
  30.         char c = str[i];  
  31.         switch (c) {  
  32.         case '%': 
  33.             if (i + 2 >= str.size()) { 
  34.                 /// Приведите пример входных данных, на которых возникнет такая ошибка 
  35.                 cerr << "Error!" << endl;
  36.                 return "";
  37.             } 
  38.             res += parse_char(str, i + 1);  
  39.             i += 3; 
  40.             break;  
  41.         case '+':
  42.             c = ' '; 
  43.         /// Почему здесь не увеличиваем i? 
  44.         default: 
  45.             res += c;  
  46.             i++; 
  47.         } 
  48.     } 
  49.     return res; 
  50. } 
  51.  
  52. void print_key_value(string key, string value) { 
  53.     if (key.empty()) /// Зачем это условие? Ведь уже есть одна проверка на пустой ключ 
  54.         return; 
  55.      
  56.     cout << decode(key) << ": " << decode(value) << endl; 
  57. } 
  58.  
  59. int main(int argc, char* argv[]) { 
  60.     if (argc < 2) 
  61.         return 0; 
  62.        
  63.     char* input = argv[1]; 
  64.    
  65.     char buffer[MAX_BUFFER];  
  66.     int pos = 0; 
  67.  
  68.     string key;  
  69.     string value;  
  70.     int i = 0; 
  71.     while (input[i] != '\0') { 
  72.         char c = input[i]; 
  73.         switch (c) { 
  74.         case '=':
  75.             key = string(buffer, pos); 
  76.             if (key.empty()) 
  77.                 cerr << "Error!" << endl;  
  78.             pos = 0; 
  79.             break;  
  80.         case '&': 
  81.             value = string(buffer, pos); 
  82.             /// Что будет, если сразу встретится '&' ? 
  83.             print_key_value(key, value);  
  84.             key = ""; 
  85.             value = "";
  86.             pos = 0;  
  87.             break;
  88.         default: 
  89.             buffer[pos] = c;  
  90.             pos++; 
  91.         }  
  92.         i++; 
  93.     } 
  94.     if ((key == "") && (pos != 0)) { 
  95.         /// Приведите пример, когда произойдет эта ошибка 
  96.         cerr << "Error!" << endl; 
  97.     } 
  98.    
  99.     value = string(buffer, pos); 
  100.     print_key_value(key, value); /// Зачем еще один вызов этой функции? 
  101.          
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement