更新:正確地初始化字符串char string[sizeof buffer - 1]
已解決崩潰問題,但我仍然好奇多少標點符號必須處理它!使用C中的sscanf讀取帶空格的字符串時出現的標點符號錯誤
我想從「某些文本」形式的文件中讀取一個字符串。到目前爲止,使用sscanf
和\"%[^\"]\"
這個模式對我來說是完美的,但是一旦我開始爲字符串添加標點符號,程序就開始崩潰。
似乎只有使用多個標點符號時纔會出現錯誤,無論標點符號是什麼或標記的位置如何。它也會出現,無論文件中帶有標點符號的行的位置(即,即使最後一行沒有標點符號,錯誤仍然存在)。
不管怎樣,下面是我到目前爲止的代碼:
char* func(char* f_name);
FILE* file = get_file(f_name,"r"); // a short function I wrote to get the
// file pointer from the current
// directory. The error is almost
// certainly not here.
if (file == 0) {
print("Unable to load file\nExiting...");
exit(-1);
}
char* pattern = "\"%[^\"]\"";
int read_args = -1;
char* string; // string size is unknown until read
char buffer[1200]; // i expect very long line of data in the file
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("found line: %s\n",buffer);
read_args = sscanf(buffer, pattern, string);
printf("num args: %d\n",read_args);
printf("read value: %s\n", string);
}
fclose(file);
return string;
}
以下是一些數據我都試過了。程序編譯時標記爲「不成功」,運行一切,並在退出之前崩潰。
"test test test" // successful
"test, test test" // successful
"test test; test" // successful
"test, test, test" // unsuccessful
"test; test. test," // unsuccessful
我打算使用更復雜的模式,如果這個問題得到解決,並與圖案%d \"%[^\"]\" \"%[^\"]\"
此錯誤發生之前成功讀取數據。預先感謝任何答案。
謝謝,這似乎解決了這個問題。我仍然很好奇標點符號與它有什麼關係,但是...... – 2012-01-14 17:29:43
一旦你調用未定義的行爲,任何事情都可能發生,根據標準它是OK的。函數可能表現不當或行爲不當 - 因爲行爲未定義,所以這一切都可以。所以,不惜一切代價避免未定義的行爲。而且,當你發現你使用的是未定義的行爲時,不要花太多時間來煩惱它爲什麼會像以前那樣行事不端。然而,如果你真的好奇,你可以做一些事情,比如'嘗試在舊版本中打印'字符串'',以查看它實際正在處理的內容,而不是你認爲可能正在處理的內容。但這可能不值得。 – 2012-01-14 18:27:48