2014-10-16 33 views
2

我試圖寫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. 
+0

什麼是'請求'?如果有的話,它與'scgi_request'有關嗎? – 2014-10-16 22:23:44

+0

@ user657267它不應該,因爲在ctor中他指定了字符串的長度,並且'\ 0'不被視爲構造上的特殊字符 – vsoftco 2014-10-16 22:26:44

+1

我認爲通過傳遞長度來創建字符串會避免這種情況? – ruipacheco 2014-10-16 22:26:46

回答

8

你的字符串開頭:

"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'這是1824,但你輸出吧,1924因此輸出之前,第一個做++

如果你的意思是'\0'然後'2'然後'7'那麼你就不需要並列這些東西,利用字符串文字串聯:

"70:CONTENT_LENGTH\0" 
"27\0" 
"SCGI\0" 
"1\0" 
+0

我怎樣才能找到27號? – ruipacheco 2014-10-16 22:31:29

+0

@lapinrigolo寫成你的字符串不包含數字27.''\ 027''是一個不可打印的字符(無論如何都是ASCII)。我已經更新了我的答案,建議修復 – 2014-10-16 22:33:10

+0

@lapinrigolo您正在尋找ESC字符嗎?除了''\ 0''之外,這需要額外的邏輯! – 2014-10-16 22:38:14