下面有一段代码,它基本上读取文本文件data.txt
并打印到控制台。 data.txt
的内容低于代码清单;
#include "stdio.h"
#define BUFFER_SIZE 93
int main(int argc, char *argv[]){
const char *datafile;
char line[BUFFER_SIZE],*string1;
int a,b,c,d,e;
FILE * File_ptr;
datafile = "data.txt";
File_ptr = fopen(datafile,"r");
if(File_ptr == NULL ){
printf("Error opening file %s\n",datafile);
}
while(fgets(line,BUFFER_SIZE,File_ptr) != 0){
puts(line);
sscanf(line, "%d %d %d %d %d %s", &a,&b,&c,&d,&e,string1);
printf("%d, %d, %d, %d, %d, %s\n",a,b,c,d,e,string1);
}
fclose(File_ptr);
}
data.txt
中的内容:
100 200 888 456 5443 file1.abc
180 670 812 496 5993 file2.abc
160 230 345 546 5123 file3.abc
23 455 342 235 214 file4.abc
233 5455 3142 2435 1214 file5.abc
我不明白的是:如果BUFFER_SIZE
被定义为< 97
,输出将是这样的:
100 200 888 456 5443 file1.abc
100 200 888 456 5443 (null)
180 670 812 496 5993 file2.abc
180 670 812 496 5993 (null)
160 230 345 546 5123 file3.abc
160 230 345 546 5123 (null)
23 455 342 235 214 file4.abc
23 455 342 235 214 (null)
233 5455 3142 2435 1214 file5.abc
233 5455 3142 2435 1214 (null)
如果BUFFER_SIZE
定义为97 ~ 120
,输出就可以了,如下所示:
100 200 888 456 5443 file1.abc
100 200 888 456 5443 file1.abc
180 670 812 496 5993 file2.abc
180 670 812 496 5993 file2.abc
160 230 345 546 5123 file3.abc
160 230 345 546 5123 file3.abc
23 455 342 235 214 file4.abc
23 455 342 235 214 file4.abc
233 5455 3142 2435 1214 file5.abc
233 5455 3142 2435 1214 file5.abc
如果BUFFER_SIZE
定义为>120
,则会在sscanf()
来电时触发细分错误。
有人可以告诉我这种行为的原因吗?
答案 0 :(得分:4)
你的string1
是一个未初始化的未初始化指针。您的sscanf
尝试将数据存储到string1
所指向的位置,这是无处可去的。您的程序显示未定义的行为。它可以段错误,它可以输出废话,它可以做任何事情。这种程序的实际行为可能会因无可解释的原因而改变。这正是你观察到的。