2012-01-14 54 views
2

更新:正確地初始化字符串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 \"%[^\"]\" \"%[^\"]\"此錯誤發生之前成功讀取數據。預先感謝任何答案。

回答

3

您的代碼會調用未定義的行爲,因爲您正在掃描隨機內存。

變量string從不初始化,所以sscanf()寫入的字符串的目的地是未定義的。

您需要

char string[sizeof buffer - 1]; 

事實上,它並不總是崩潰只是運氣,代碼始終調用未定義的行爲。根據您的示例,標點符號可能就是這樣,掃描的文本更長,因此覆蓋了更多的內存,一旦碰到足夠重要的事件,最終會觸發崩潰。

+0

謝謝,這似乎解決了這個問題。我仍然很好奇標點符號與它有什麼關係,但是...... – 2012-01-14 17:29:43

+0

一旦你調用未定義的行爲,任何事情都可能發生,根據標準它是OK的。函數可能表現不當或行爲不當 - 因爲行爲未定義,所以這一切都可以。所以,不惜一切代價避免未定義的行爲。而且,當你發現你使用的是未定義的行爲時,不要花太多時間來煩惱它爲什麼會像以前那樣行事不端。然而,如果你真的好奇,你可以做一些事情,比如'嘗試在舊版本中打印'字符串'',以查看它實際正在處理的內容,而不是你認爲可能正在處理的內容。但這可能不值得。 – 2012-01-14 18:27:48

相關問題