2016-08-22 125 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的字符串也会产生问题。