fscanf和seg的问题。故障

时间:2012-09-21 00:20:20

标签: c

char temp[100];
char event[1000];
int i = 0;

do {
    while (true) {
        **fscanf(fin, "%s", &temp);**
        if (temp != "BEGIN:VEVENT" || temp != "BEGIN:VCALENDAR") {
            strcat(event, temp);
        }

        if (temp == "END:VEVENT") {
            Events[i][0] = *event;
            i++; 
            break;
        } else if (temp == "END:VCALENDAR") {
            //temp = EOF;
            break;
        }
    }
    fprintf(stdout, "%s\n", Events[i - 1]);
} while (*temp != EOF);

我用星号包围的线条导致了seg。故障。我不能,为了我的生活,弄清楚发生了什么。

2 个答案:

答案 0 :(得分:2)

如果行超过100个字符,则可能遇到缓冲区溢出。如果您只想获得一行输入,请改用fgets

if(fgets(temp, sizeof(temp), fin) == NULL) {
    perror("fgets");
    /* return a failure code */
}

您也无法使用==!=来比较字符串;请改用strcmp

我相信您的代码崩溃是因为temp != "BEGIN:VEVENT"始终为true(temp缓冲区的地址永远不会等于常量字符串的地址),因此您将继续{{1}直到缓冲区空间不足,导致程序缓冲溢出strcat并崩溃。

答案 1 :(得分:1)

你确定是那条线吗?如果是这样,您可能会有缓冲区溢出。另外,您不应将&temp传递给fscanf。如果你使用没有索引的数组,你可以把它想象成一个指针(尽管从技术上讲它不是)。所以你应该这样做:

fscanf(fin, "%s", temp);

另外,你这样做:

strcat(event, temp);

event未初始化。您需要至少终止event字符串,否则strcat最终可能会搜索整个数组(取决于其中未初始化的值),并且可能会溢出:

char event[1000];
event[0] = 0;