来自sscanf的有趣行为

时间:2015-02-28 03:59:09

标签: c scanf

下面有一段代码,它基本上读取文本文件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()来电时触发细分错误。

有人可以告诉我这种行为的原因吗?

1 个答案:

答案 0 :(得分:4)

你的string1是一个未初始化的未初始化指针。您的sscanf尝试将数据存储到string1所指向的位置,这是无处可去的。您的程序显示未定义的行为。它可以段错误,它可以输出废话,它可以做任何事情。这种程序的实际行为可能会因无可解释的原因而改变。这正是你观察到的。