2016-08-22 94 views
2

我是stackoverflow的新用戶。我用c寫了這段代碼,我沒有問題,輸出也是正確的。如何使用fscanf讀取c中的文件(分段錯誤)?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char *str[10]; 
    FILE * fp; 

    fp = fopen ("file.txt", "w+"); 
    fputs("We\nare\nin\n2016", fp); 

    rewind(fp); 

    fscanf(fp, "%s", str[0]); 
    fscanf(fp, "%s", str[1]);    

    printf("Read String1 |%s|\n", str[0]); 
    printf("Read String2 |%s|\n", str[1]); 

    fclose(fp); 

    return(0); 
} 

但是當我使用char * str [15]而不是char * str [10]時,結果是分段錯誤。哪裏不對?

+1

「str」數組中的每個指針在哪裏?僅僅因爲具有*未定義行爲的程序似乎可行,並不意味着它是正確的。 –

+0

爲什麼這是正確的str [10]?我也初始化了str [15],但沒有開始工作 –

+1

它不適用於例如'char * str [10]',這似乎是純粹的運氣似乎工作(好運或壞運氣是一個觀點問題)。它似乎*工作,你仍然會看似隨機覆蓋一些內存。請記住,不確定行爲的一個可能症狀是它實際上可行,不幸的是。 –

回答

1

指針str[0]str[1]未初始化。所以,你的程序有未定義的行爲

要麼需要使用malloc()分配或使它們陣列的具有固定長度這足以夠你從文件中讀取的字符串的數組(例如str[2][256];)。 在任何情況下,我會親自使用fgets()而不是fscanf(),然後根據需要解析該行。

它也將有助於爲所有函數(fopen(),fscanf()等)進行錯誤檢查。

+0

爲什麼這對str [10]是正確的?我還初始化了str [15],但不工作 –

+1

'char * str [10]'是一個指針數組,這些指針沒有初始化。他們沒有指出你可以寫入的任何記憶。所以你需要用如下的東西進行初始化:'str [0] = malloc(256); str [1] = malloc(256);'(或者在答案中使用數組)。 – usr

0

請記住,您聲明瞭char * str [10],您爲十個指針保留了內存,但未調用malloc爲這些指針的內容保留內存。

您的示例與函數fscanf,http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm的本教程類似。

但是,在那裏,字符串部分被聲明爲char [10]而不是char * [10],這意味着它們已經爲10個字符保留了內存。在這個例子中,讀取長度大於10的字符串也會產生問題。