получать «-317629566» всякий раз, когда я выполняю код - PullRequest
0 голосов
/ 04 января 2019

Я использую dev ++ для программирования c, и я сделал на простую программу сложения, вычитания, мульти и Div. в моем коде нет ошибки, но я получаю сообщение типа 9 цифр (-317629566) другого типа вместе с выводом на экране вывода.

#include<stdio.h>
#include<conio.h>

main()
{
    int a, b;
    char op;

    printf("select a operator(+, -, *, /) :: ");
    scanf("%c", &op);
    printf("enter first number : ");
    scanf("%d", &a);
    printf("enter second number : ");
    scanf("%d", &b);

    switch (op)
    {
        case '+':
            printf("addition : %d%d", a + b);
            break;
        case '-':
            printf("subtraction : %d%d", a - b);
            break;
        case '*':
            printf("multiplication : %d%d", a *b);
            break;
        case '/':
            printf("divison : %d%d", a / b);
            break;
        default:
            printf("not a operator");
    }
    getch();
}

Это вывод, который я получаю после выполнения кода.

select a operator( + , - , * , / ) :: +
enter first number : 12
enter second number : 13
addition : 25-317629566

почему я получаю -317629566 результат.

Ответы [ 3 ]

0 голосов
/ 04 января 2019
printf("addition : %d%d", a + b);

Вы просите printf напечатать два целых числа, но вы пропускаете только одно. Это вызывает неопределенное поведение . В этом случае это просто печать произвольного значения, но потенциально могут произойти худшие вещи.

0 голосов
/ 04 января 2019

Как я уже писал в своем комментарии, все операторы 4 printf (внутри блока switch ) неверны.

Согласно [CPPReference]: std :: printf, std :: fprintf, std :: sprintf, std :: snprintf ( выделение - мое):

  • ... - аргументы, определяющие данные для печати. Если какой-либо аргумент после преобразования по умолчанию не соответствует типу, ожидаемому соответствующим спецификатором преобразования, или если число аргументов меньше, чем требуется для формата, поведение не определено . Если аргументов больше, чем требуется по формату, посторонние аргументы оцениваются и игнорируются

Давайте возьмем 1 st (printf("addition : %d%d", a + b);) в качестве примера:

  • Ваш формат строки ( printf 1 st аргумент) содержит 2 % d (целое число со знаком в десятичном виде) спецификаторы преобразования Это означает, что printf ожидает 2 целочисленных значений после него
  • a + b производит только 1 целочисленное значение, и вы попадаете в ветку Undefined Behavior . В этом случае printf выводит данные мусора (с некоторого «случайного» адреса памяти), но имейте в виду, что могут быть случаи, когда программа может аварийно завершить работу

Чтобы устранить проблемы:

  • Убедитесь, что номер спецификатора преобразования соответствует номеру аргументов (также обратите внимание на их тип), которые соответствуют формату: printf("addition : %d", a + b);

  • Чтобы продвинуться дальше, чтобы получить красиво отформатированный вывод, добавьте " \ n " ( LF , 0x0A , EOLN ) символ в конце строки формата: когда такой символ встречается, он не отображается на экране, но курсор переходит в начало следующей строки: printf("Addition: %d\n", a + b);

  • Чтобы пойти дальше, вы также можете напечатать числа, которые дали этот результат: printf("Addition: %d + %d = %d\n", a, b, a + b); ( 3 % d s, 3 целых числа после спецификатора формата)

В качестве последнего примечания (не связанного с самим вопросом), вы можете избежать разделения, когда b равно 0.

0 голосов
/ 04 января 2019

Проблема заключается в способе отображения данных:

printf("addition : %d%d", a + b);

Используйте только один спецификатор формата, если у вас есть только одна вещь для вывода.

printf("addition : %d", a + b);

Это будет работать.

Кроме того, я предлагаю использовать тип float / double для хранения результата деления, поскольку деление двух целых чисел преобразует результат в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...