fscanf和seg的问题。缺点

fscanf和seg的问题。缺点,c,C,我用星号括起来的那条线引起了seg。缺点。我一辈子都搞不清楚到底发生了什么 如果行长度超过100个字符,则可能会遇到缓冲区溢出。如果您只想获得一行输入,请使用fgets: char temp[100]; char event[1000]; int i = 0; do { while (true) { **fscanf(fin, "%s", &temp);** if (temp != "BEGIN:VEVENT" || temp != "BEGIN

我用星号括起来的那条线引起了seg。缺点。我一辈子都搞不清楚到底发生了什么

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

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);
您也不能使用
==
来比较字符串=;改用strcmp


我相信你的代码崩溃是因为
temp!=“BEGIN:VEVENT”
始终为真(缓冲区的地址永远不等于常量字符串的地址),因此您将继续执行strcat,直到缓冲区耗尽空间,导致程序缓冲区溢出
事件
并崩溃。

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

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);
您也不能使用
==
来比较字符串=;改用strcmp


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

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

if(fgets(temp, sizeof(temp), fin) == NULL) {
    perror("fgets");
    /* return a failure code */
}
此外,您还可以执行以下操作:

fscanf(fin, "%s", temp);
但是
事件
未初始化。您至少需要终止
事件
字符串,否则
strcat
可能会在整个数组中搜索字符串的结尾(取决于其中未初始化的值),并可能溢出:

strcat(event, temp);

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

if(fgets(temp, sizeof(temp), fin) == NULL) {
    perror("fgets");
    /* return a failure code */
}
此外,您还可以执行以下操作:

fscanf(fin, "%s", temp);
但是
事件
未初始化。您至少需要终止
事件
字符串,否则
strcat
可能会在整个数组中搜索字符串的结尾(取决于其中未初始化的值),并可能溢出:

strcat(event, temp);

为什么要用常量字符数组来比较temp?那不会像你想的那样。您需要使用strmpthis:“fprintf(stdout,“%s\n”,Events[i-1]);”如果我没有递增,可能会爆炸。或者i=0。注意,代码永远不能
break
,因为只有
break
语句位于无法访问的代码中。这是另一个问题。太多了,无法列出。Matt,它是递增的,实际上只是一个调试工具-它不会出现在最终的程序中。编辑:我已经很长时间没有使用c了,我还在学习字符串比较等。为什么要用常量字符数组来比较临时值?那不会像你想的那样。您需要使用strmpthis:“fprintf(stdout,“%s\n”,Events[i-1]);”如果我没有递增,可能会爆炸。或者i=0。注意,代码永远不能
break
,因为只有
break
语句位于无法访问的代码中。这是另一个问题。太多了,无法列出。Matt,它是递增的,实际上只是一个调试工具-它不会出现在最终的程序中。编辑:我已经很长时间没有使用c了,我还在学习字符串比较,等等。“那个数组实际上是一个指针”——这是错误的,在这里这么说是不可取的。数组在传递给函数时会转换为指向其第一个元素的指针。但是:+1表示“事件未初始化”,因为它似乎被声明为自动。对不起,我的错误。。。我会调整我的措辞这个数组实际上是一个指针'——错了,在这里这么说是不可取的。数组在传递给函数时会转换为指向其第一个元素的指针。但是:+1表示“事件未初始化”,因为它似乎被声明为自动。对不起,我的错误。。。我会调整我的措辞很好的尝试,这可以解决一些问题,但远不是全部。OP的代码是UB对UB对UB。我没碰它。他应该拿到一本C书,从第一章开始……是的,我知道。我注意到了一些bug,发布了它们,然后当我读得更透彻一点时就放弃了……很好的尝试,这将修复其中的一些bug,但远不是全部bug。OP的代码是UB对UB对UB。我没碰它。他应该拿到一本C书,从第一章开始……是的,我知道。我注意到了一些bug,发布了它们,当我读得更透彻一点时就放弃了。。。