Не удается разобрать строку с нулевым символом

Я пытаюсь написать парсер для SCGI- запросов. Я пытаюсь разобрать строку, описанную в примере, но по какой-то причине не могу найти позицию второго нулевого символа, который разделяет значение длины содержимого и имя следующего свойства.

Это моя тестовая строка:

string scgi_request(
    "70:CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0" \
    "/deepthought\0,What is the answer to life?"
   , 91);

Я могу найти позицию первого нулевого символа, положение 18. Но как только я пытаюсь найти следующий после этого, возвращаемая позиция недействительна, на несколько символов, вплоть до позиции 24.

Это мой алгоритм:

size_t contentLengthEnd = scgi_request.find('\0');
size_t contentLengthValueEnd = scgi_request.find('\0', ++contentLengthEnd);
std::cerr << contentLengthEnd << std::endl; // 19, because I shifted this one forward 
                                            // otherwise I'd always get the same 
                                            // character
std::cerr << contentLengthValueEnd << std::endl; // 24, no clu why.

1 ответ

Решение

Ваша строка начинается:

"70:CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0" 

Эти выводы на самом деле правильны для строки, которую вы дали. Я предполагаю, что вы можете не заметить, что \027 является восьмеричной константой символа и т. д. Персонажи и их индексы:

16: 'H'
17: '\027'
18: '\0'
19: 'S'
20: 'C'
21: 'G'
22: 'I'
23: '\01'
24: '\0'
25: 'R'

Ваша программа находит первые два '\0' которые 18 а также 24, но ты делаешь ++ на первом, прежде чем выводить его, следовательно, вывод 19 а также 24,

Если бы вы имели в виду '\0' затем '2' затем '7' тогда вам не нужно сопоставлять эти вещи, например, использовать конкатенацию строковых литералов:

"70:CONTENT_LENGTH\0"
"27\0" 
"SCGI\0"
"1\0"
Другие вопросы по тегам