1. ホーム
  2. c

[解決済み】C言語で浮動小数点例外(コアダンプ)発生

2022-01-28 04:01:37

質問

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;
}

解決方法は?

EDITは、私が最初に推測したように、それはゼロによる除算です。

        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