Исключение с плавающей точкой (дамп ядра) в C - PullRequest
0 голосов
/ 07 августа 2020

При написании программы 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;
}

Ответы [ 2 ]

1 голос
/ 07 августа 2020

РЕДАКТИРОВАТЬ как для моей первоначальной догадки - это деление на ноль

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

Вот эта функция упрощена: 1010 *https://godbolt.org/z/q4oWqT

0 голосов
/ 08 августа 2020

этот оператор:

mod /= 10;

в конечном итоге приводит к mod, содержащему 0. Затем этот оператор:

remain = number % mod;

приводит к операции деления на 0

...