c - C 中的浮点异常(核心转储)

标签 c linux floating-point scanf fedora

在编写 C 程序并在 fedora 32 中编译它时,当我尝试从终端扫描用户的输入时,我总是收到此消息浮点异常(核心转储),但我没有知道我做错了什么。

我在中间放置了一些 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;
}

最佳答案

编辑我最初的猜测 - 它被零除

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

始终检查scanf的结果。你在这里没有任何浮点运算,但可能在你没有显示的代码中的某个地方除以零。

#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

关于c - C 中的浮点异常(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63299892/

相关文章:

将字符串从静态内存复制到动态内存失败

java - SecureRandom 的 SHA1PRNG 算法是否使用/dev/random 作为熵?

java浮点精度(0.1+0.2+...+1.00 ..or.. 1.00+0.99+0.98+...+0.1)

r - 将浮点精度添加到qnorm/pnorm吗?

c - 如何在 C 中不使用 printf 打印 LLONG_MIN?

C语言 sizeof(char[]) 获取静态大小

linux - SSL 库错误 : error: SSL routines:ssl3_get_client_hello:no shared cipher - Too restrictive SSLCipherSuite or using DSA server certificate

linux - Kubernetes:编织网络未安装

php - 带有 Doctrine 和 PHP 的 8 字节整数

c - 如何用C语言替换txt文件中的单词?