gpt4 book ai didi

c - 什么是段错误?为什么该程序显示段错误?

转载 作者:行者123 更新时间:2023-11-30 20:31:19 25 4
gpt4 key购买 nike

在这里,我尝试从字符串中获取 token ,并以空格分隔。但是,如果我在没有 while 循环的情况下运行该程序,则会出现段错误。很好,但是为什么呢?

<小时/>

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char c[1000];
int tnum, a, b, d;
char *n;
scanf("%d", &tnum);
while(tnum != 0)
{
scanf("%[^\n]s", c);

n = strtok(c, " ");
a = atoi(n);

n = strtok(NULL, " ");
b = atoi(n);

n = strtok(NULL, " ");
d = atoi(n);

printf("%d\n", a * b * d);
tnum--;
}
return 0;
}

最佳答案

当程序尝试访问不允许使用的内存时,通常会导致段错误。阅读 What is a segmentation fault? .

在您的情况下,这可能是由于您使用字符数组c[]strtok()函数的方式引起的。

strtok()根据第二个参数形式的分隔符修改其第一个参数。

例如,如果您这样做

char s[]="hello world how are you?";
strtok(s, " ");
printf("\n%s", s);

输出只是

hello

而不是

hello world how are you?

因为带有分隔符的位置被覆盖。这就是 strtok() 不能用于字符串文字的原因。

在不使用 while 循环的情况下尝试时不会出现错误的原因可能是因为 c[] 在内存部分中有一些空格,程序被允许访问。 strtok() 将继续寻找分隔符,直到找到表示字符串结尾的 \0,该分隔符可能位于任何位置,因为 c[] 有垃圾.

<小时/>

您还没有初始化c[],它只是有一些垃圾值。并且可能有也可能没有 (空格),strtok() 将其视为您在 c 中预留的 1000 个字符的空格内的分隔符[]。如果这 1000 字节内没有 ,则 strtok() 将超出数组 c[] 的范围,并可能修改内存不允许该程序访问。

请注意

scanf("%[^\n]s",c);

您要求程序读取所有内容,直到\n,然后是's'。额外的 s 不是必需的。只需 '%[^\n]` 就可以了。

但是 scanf() 不适合这种情况,因为它很容易导致溢出。阅读 Disadvantages of scanf 。您可以尝试使用 fgets() 来代替

if( fgets(c, sizeof(c), stdin)==NULL )
{
//something went wrong.
}

fgets() 出错时返回 NULL

但请记住,fgets() 也会读取尾随的 \n。阅读 Removing trailing newline character from fgets input .

因此,按照该文章中的建议,执行类似的操作

char *pos;
if( (pos=strchr(c, '\n'))!=NULL )
{
*pos='\0';
}

\n 替换为表示字符串结尾的 nul 字符。

你完成了吗

scanf("%[^\n]", c);

相反,\n 将在输入缓冲区中保持未使用状态,如果稍后不加以处理,可能会导致问题。

您可能还想查看How to convert a string to integer in C因为 atoi() 不允许进行正确的错误检查。

关于c - 什么是段错误?为什么该程序显示段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com