Почему код принимает и выдает случайные числа при вводе чисел в диапазоне? - PullRequest
0 голосов
/ 05 мая 2020

Я делаю обычный базовый c калькулятор на Simple C. Я использовал double для хранения чисел, и я ввожу 9 и 81 как числа, но код принимает некоторые случайные числа и использует их для вычисления ответа. Вот код:

#include <stdio.h>

int main(void){
double i,l,j;
char k;
    loop: printf("Enter integer 1 : ");
    scanf("%i",&i);
    printf("Enter integer 2 : ");
    scanf("%i%*c",&j);
    printf("Enter code for operation  p = +, m = -, s = *, 4 = d  : ");
    scanf("%c%*c",&k);
    switch(k){
        case 'p' : l = i + j; printf("%d + %d = %d\n",&i,&j,&l);
            break;
        case 'm' : l = i - j; printf("%d - %d = %d\n",&i,&j,&l);
            break;
        case 's' : l = i * j; printf("%d * %d = %d\n",&i,&j,&l);
            break;
        case 'd' : l = i / j; printf("%d / %d = %d\n",&i,&j,&l);
    }
    exit: printf("enter \"r\" to continue or \"x\" to exit.....\n");
    char exit_v;
scanf("%c" , &exit_v);
    switch(exit_v){
      case 'r':goto loop;
        break;
      case 'x':return 0;
        break;
     default: { printf("Enter valid arguments..." );
                goto exit;}

        }
}

И что будет на выходе:

Enter integer 1 : 9
Enter integer 2 : 81
Enter code for operation  p = +, m = -, s = *, 4 = d  : p
-511875960 + -511875976 = -511875968
enter "r" to continue or "x" to exit.....
x

[Process completed - press Enter]

Почему он принимает случайные целые числа в качестве входных данных, когда я ввожу число в диапазоне?

1 Ответ

0 голосов
/ 05 мая 2020

Исправление вашего кода (изменения сообщаются комментариями):

#include <stdio.h>

int main(void)
{
    double i, l, j;
    char k;
loop:
    printf("Enter integer 1 : "); // USE %lf FOR READING DOUBLES
    scanf("%lf", &i);
    printf("Enter integer 2 : ");
    scanf("%lf", &j);
    printf("Enter code for operation  p = +, m = -, s = *, 4 = d  : ");
    scanf("%c", k); // You don't need to use &k to read a single char
    switch (k)
    {
    case 'p':
        l = i + j;
        printf("%lf + %lf = %lf\n", i, j, l); // don't read addresses, get values directly
        // secondly you've used %d to read a double, that's incompatible with the variables,
        // use %lf to read/write doubles
        break;
    case 'm':
        l = i - j;
        printf("%lf - %lf = %lf\n", i, j, l);
        break;
    case 's':
        l = i * j;
        printf("%lf * %lf = %lf\n", i, j, l);
        break;
    case 'd':
        l = i / j;
        printf("%lf / %lf = %lf\n", i, j, l);
    }
exit:
    printf("enter \"r\" to continue or \"x\" to exit.....\n");
    char exit_v;
    scanf("%c", exit_v);
    switch (exit_v)
    {
    case 'r':
        goto loop;
        break;
    case 'x':
        return 0;
        break;
    default:
    {
        printf("Enter valid arguments...");
        goto exit;
    }
}

В качестве совета по программированию помните, что в следующий раз использование операторов goto является плохой практикой в ​​системе кодирования.

...