如何使用 fscanf 读取 c(Segmentation Fault) 中的文件?
How to use fscanf for reading files in c(Segmentation Fault)?
我是 Whosebug
的新用户。我用 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] 时,结果是分段错误。怎么了?
指针 str[0]
和 str[1]
未初始化。因此,您的程序具有 未定义的行为 。
要么您需要使用 malloc()
进行分配,要么使它们成为数组的数组(例如 str[2][256];
),其长度足以容纳您从文件中读取的字符串。
无论如何,我个人会使用 fgets()
而不是 fscanf()
,然后根据需要解析该行。
这也有助于对所有函数(fopen()、fscanf() 等)进行错误检查。
请记住,您正在声明 char * str[10],您正在为十个指针保留内存,但您没有调用 malloc 为这些指针的内容保留内存。
您的示例似乎与函数 fscanf 的本教程相似,http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm。
但是在那里,字符串部分被声明为 char[10] 而不是 char *[10] 这意味着它们已经为 10 个字符保留了内存。在同一个示例中,读取长度大于 10 的字符串也会产生问题。
我是 Whosebug
的新用户。我用 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] 时,结果是分段错误。怎么了?
指针 str[0]
和 str[1]
未初始化。因此,您的程序具有 未定义的行为 。
要么您需要使用 malloc()
进行分配,要么使它们成为数组的数组(例如 str[2][256];
),其长度足以容纳您从文件中读取的字符串。
无论如何,我个人会使用 fgets()
而不是 fscanf()
,然后根据需要解析该行。
这也有助于对所有函数(fopen()、fscanf() 等)进行错误检查。
请记住,您正在声明 char * str[10],您正在为十个指针保留内存,但您没有调用 malloc 为这些指针的内容保留内存。
您的示例似乎与函数 fscanf 的本教程相似,http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm。
但是在那里,字符串部分被声明为 char[10] 而不是 char *[10] 这意味着它们已经为 10 个字符保留了内存。在同一个示例中,读取长度大于 10 的字符串也会产生问题。