0
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。故障。对于我的一生,我无法弄清楚发生了什么。

4

2 回答 2

2

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

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

您也不能使用==and比较字符串!=;改为使用strcmp

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

于 2012-09-21T00:26:12.103 回答
1

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

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

另外,你这样做:

strcat(event, temp);

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

char event[1000];
event[0] = 0;
于 2012-09-21T00:35:05.153 回答