【问题标题】:Floating point exception (core dumped) in CC中的浮点异常(核心转储)
【发布时间】:2020-08-07 10:24:49
【问题描述】:

在编写 C 程序并在 fedora 32 中编译时,当我尝试从终端扫描用户输入时,总是收到此消息 Floating point exception (core dumped),我不知道自己做错了什么。

我在两者之间放置了一些 printf 函数以了解它在哪里停止,以及我发现 scanf ("%i", &number); 函数没有读取输入或正确保存它。

这是部分代码:

   #include <stdio.h>

int main (void)
{
    int number, constant, remain, remain1, mod, count, test;
    
    number = 0;
    mod = 1;
    count = 0;

    printf ("Enter a number to write: \n");
    scanf ("%i", &number);
    
    printf ("-1");
    
    constant = number;
    test = number;
    printf ("0");
    if (number < 0)
    {
        number = number * -1;
        printf ("-");
    }
    printf ("1");
    while (test != 0)
    {
        test /= 10;
        count++;
        printf ("%i", count);
    }
    printf ("2");
    for (int i = 1; i < count; i++)
    {
        mod = mod * 10; 
    }
    printf ("3");
    while (number != 0)
    {
        
        remain = number % mod;
        remain1 = constant - remain * mod;
        
        switch (remain)
        {
            case 0:
                printf ("Zero");
                break;
            case 1:
                printf ("One");
                break;
            case 2:
                printf ("Two");
                break;
            case 3:
                printf ("Three");
                break;
            case 4:
                printf ("Four");
                break;
            case 5:
                printf ("Five");
                break;
            case 6:
                printf ("Six");
                break;
            case 7:
                printf ("Seven");
                break;
            case 8:
                printf ("Eight");
                break;
            case 9:
                printf ("Nine");
                break;
        }

        remain = remain1;
        mod /= 10;
    }
    
        printf ("\n");
    
    return 0;
}

【问题讨论】:

  • char temp[1000]; if (!fgets(temp, sizeof temp, stdin)) exit(EXIT_FAILURE); if (sscanf(temp, "%i", &amp;number) != 1) { fprintf(stderr, "error reading number from %s", temp); exit(EXIT_FAILURE); }替换scanf(...)
  • 还是一样。
  • 所以,scanf() 调用不是问题
  • 这听起来是一个学习使用调试器的好机会。
  • 你使用 %f 但数字是 int

标签: c linux floating-point scanf fedora


【解决方案1】:

按照我最初的猜测进行编辑 - 它是除以零

        if(!mod ) // add this if 
             {printf("Division by zero");exit(0);} //
        remain = number % mod;

始终检查scanf 的结果。 Yuo 在这里没有任何浮点运算,但可能您在未显示的代码中某处被零除。

#include <stdio.h>

int main (void)
{
    int number, constant, remain, remain1, mod, count, test;
    
    number = 0;
    mod = 1;
    count = 0;

    printf ("Enter a number to write: \n");
    if(scanf ("%i", &number) != 1)
    {
        printf("scanf error\n");
    }
    else
    {    
        printf ("-1");
        
        constant = number;
        test = number;
        printf ("0");

        if (number < 0)
        {
            number = number * -1;
            printf ("-");
        }

        printf ("1");

        while (test != 0)
        {
            test /= 10;
            count++;
            printf ("%i", count);
        }

        printf ("2");

        for (int i = 1; i < count; i++)
        {
            mod = mod * 10; 
        }
    }
}

这里你把这个函数简单化了:

char *digits[] = {"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};

void printWord(int x)
{
    int work = x;
    long val = 1;
    while(work)
    {
        val *= 10;
        work /= 10;
    }
    val /= 10;
    if(x < 0) printf("Minus");
    if(!x) val = 10;
    do
    {
        printf("%s", digits[abs(x / val)]);
        x %= val;
        val /= 10;
    }while(x);
}

int main (void)
{
    printWord(0);    
    return 0;
}

https://godbolt.org/z/q4oWqT

【讨论】:

  • 你的代码可以正常工作,但是当我把它和我的其他代码放在一起时,我显示了同样的问题,所以我认为问题出在 switch 语句中,我会尝试再次搜索问题.
  • 向我们展示其余代码。没​​有其他方法可以帮助您
  • 我会把它放在答案中。
  • @AhmedRifaat 阅读了答案。你有被零除。你不能这样做something % 0
  • 你是对的,它是除以零。谢谢你的帮助。
【解决方案2】:

此声明:

mod /= 10;

最终导致mod包含0。那么这个语句:

remain = number % mod;

导致除以 0 操作

【讨论】:

  • 是的,你是对的,我终于设法解决了,现在一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多