gpt4 book ai didi

c - 运行时错误 SIGFPE 。为什么?

转载 作者:行者123 更新时间:2023-11-30 17:29:59 25 4
gpt4 key购买 nike

我正在尝试解决一个问题,即我必须找到正确句子的概率。我们假设一个句子中只有一个顺序是正确的。就一句“吃你饭”吧。我们可以将这句话重新排列成六种类型。例如:“给你吃米饭”,“吃米饭吧”,“你吃米饭”,“你吃米饭”,“你吃的米饭”,“米饭吃掉你”

所以结果是:1/6。

我们还假设每个句子由一些不超过10个单词的单词组成,并且每个单词的字母数少于21个。

当我提交(本地编程实践网站)它时,我总是收到运行时错误 SIGFPE。

我的代码如下:

#include<stdio.h>
#include<string.h>
int t[11];
char line[11][21];

int set_line()
{
int j=1;
char tmp[21],m;
scanf("%s",tmp);
strcpy(line[0],tmp);

while(getchar() != '\n' )
{
scanf("%s",tmp);
strcpy(line[j],tmp);
j++;
}


return j;
}

void ib()
{
int i;
t[0]=1;
t[1]=1;
t[2]=2;
for(i=3;i<11;i++)
{
t[i]=t[i-1] * i;
}

}


int main()
{
int t_line,word_cnt,n=1,i,j,tmp,p=1;
scanf("%d",&t_line);
ib();

while(t_line--)
{

word_cnt=set_line();
tmp=word_cnt;
for(i=0;i<word_cnt;i++)
{
if((strcmp(line[i],"01"))==0)
continue;
for(j=i+1;j<word_cnt;j++)
{
if((strcmp(line[i],line[j]))==0)
{
n++;
strcpy(line[j],"01");
}

}
if(n>1)
{
p=(t[tmp] / (t[tmp-n]*t[n])) * p;
tmp=tmp-n;
}
n=1;
}
p=t[tmp]*p;
printf("1/%d\n",p);
p=1;
}
return 0;
}

最佳答案

我的guess关于 SIGFPE 的来源是错误的,至少在我测试的 Mac 上是这样。崩溃发生在 set_line() 内对 strcpy() 的调用中。

错误检查您的输入,以便在没有(有效)输入时表现正常。我一开始就崩溃了,但通过简单地进行错误检查就解决了它:

int set_line(void)
{
int j = 1;
char tmp[21];
if (scanf("%s", tmp) != 1)
return 0;
strcpy(line[0], tmp);

while (getchar() != '\n')
{
if (scanf("%s", tmp) != 1)
break;
strcpy(line[j], tmp);
j++;
}

return j;
}

main()中:

    if (scanf("%d", &t_line) != 1)
{
printf("Invalid number in data\n");
return 1;
}

我从数据文件中得到的输出:

4
monolexis
parsimony rules
rice is nice
cats and dogs too

曾经是:

1/1
1/2
1/6
1/24

这看起来像是前四个阶乘(这是一种复杂的计算方法)。

<小时/>

我不喜欢修改后的输入代码。改进的第一阶段将丢失 tmpstrcpy() 操作(并且还可以防止过长的单词 - 但不能防止一行中的单词太多):

int set_line(void)
{
int j = 0;

if (scanf("%20s", line[j++]) != 1)
return 0;

while (getchar() != '\n')
{
if (scanf("%20s", line[j]) != 1)
break;
j++;
}

return j;
}

但我不喜欢“计数加数据”编程,尤其是在这样的情况下,您不需要知道存储所有传入数据的计数。让计算机来计数——它们擅长数字。您所做的计数就是一次读取一行,然后将其拆分为单词,直到达到计数的行数。最好将代码构造为一次只读取一行并处理该行,直到没有另一行可供读取为止。 set_line() 函数获取一个要处理的字符串(一行数据),而 main() 代码只是在有另一行需要读取时循环。诚然,使用 %n 逐步遍历输入数据是 sscanf() 的高级用法,但在这种情况下它也是非常有用的。

修改后的代码可以防止单词过长和一行中单词过多,如下所示:

int set_line(char *data)
{
int j;
int offset = 0;
int eow; // end of word

for (j = 0; j < 11 && sscanf(data + offset, "%20s%n", line[j], &eow) == 1; j++)
offset += eow;

return j;
}




int main(void)
{
char data[11*21];
int word_cnt, n = 1, i, j, tmp, p = 1;
ib();

while (fgets(data, sizeof(data), stdin) != 0)
{
word_cnt = set_line(data);
tmp = word_cnt;

对于同一个输入文件,现在会生成:

1/1
1/1
1/2
1/6
1/24

因为计数现在被计为输入的单个字行。

关于c - 运行时错误 SIGFPE 。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375461/

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