Advertisement
Batisk_AFF

Reading_TP_interview

Feb 25th, 2021
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 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