fscanf和seg的问题。缺点
我用星号括起来的那条线引起了seg。缺点。我一辈子都搞不清楚到底发生了什么 如果行长度超过100个字符,则可能会遇到缓冲区溢出。如果您只想获得一行输入,请使用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
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,发布了它们,当我读得更透彻一点时就放弃了。。。