Второе целое число считается 0 - PullRequest
0 голосов
/ 05 октября 2019

Я только начал изучать C, но я уже столкнулся с проблемой. Я хочу написать простой калькулятор, но - я не знаю почему - второе целое число всегда считается равным 0. Я просто не могу выяснить, в чем может быть проблема.

Вот мой код:

int main(){

    int a, b;
    char c;

    printf("Enter 2 numbers:\n");
    scanf("%d %d", &a, &b);
    printf("Enter an operator:\n");
    scanf("%s", &c);

    switch(c){
    case '+':
        printf("%d\n", a+b);
        break;
    case '-':
        printf("%d\n", a-b);
        break;
    case '*':
        printf("%d\n", a*b);
        break;
    case '/':
        printf("%d\n", a/b);
        break;
    }
}

Спасибо за помощь:)

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Вы читаете строку в один символ: %s будет читать, например. + и \n в c перезаписывают ваш стек.

Вам также следует проверить возвращаемое значение scanf() на наличие ошибок, т. Е. Если пользователь ввел неправильные данные и произошел сбой синтаксического анализатора.

С этими изменениями код работает следующим образом:

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int a, b;
    char c[20];
    int result;

    printf("Enter 2 numbers:\n");
    result = scanf("%d %d", &a, &b);
    if (result != 2) {
        perror("integer input failed");
        return(1);
    }
    printf("Enter an operator:\n");
    result = scanf("%s", c);
    if (result != 1) {
        perror("character input failed");
        return(1);
    }

    /* just showing that everything was recognized correctly... */
    printf("'%d' '%d' '%s'\n", a, b, c);

    switch(c[0]){
    ...

Пример выполнения:

$ gcc -Wall -Werror -o dummy dummy.c
$ ./dummy
Enter 2 numbers:
1 2
Enter an operator:
+
'1' '2' '+'
3
$
1 голос
/ 05 октября 2019

Вы можете использовать scanf("%d%d", &a, &b) без пробела. Обратите внимание, что ввод должен содержать пробел между числами (в противном случае 12 3 будет неотличим от 1 23). Также следует отметить, что %s предназначен для работы со строками и является небезопасным . Попробуйте использовать scanf(" %c", &c) для работы с одним символом, а не строкой (также обратите внимание на пробел перед процентом, который поглощает все пробелы перед символом оператора).

0 голосов
/ 05 октября 2019

Вы используете %s для чтения в char. Это неопределенное поведение.
Вы должны использовать правильные спецификаторы формата, чтобы избежать этого. В этом случае %c.
Кроме того, чтобы пропустить символ новой строки / возврата, который вы найдете во вводе после сканирования номера, заранее используйте пробел, т. Е. " %c".

Конец ответа,с неопределенным поведением может произойти все что угодно.

Просто для забавы, однако попробуйте этот код и используйте 2 и 257 в качестве ввода:

#include <stdio.h>

int main(){

    int a=99, b=98;
    char c='x';

    printf("Enter 2 numbers:\n");
    scanf("%d %d", &a, &b);
    printf("You entered %d %d. Now enter an operator:\n", a, b);
    scanf(" %s", &c);
    printf("After scanning a null-terminated string into a char variable, a and b are now %d %d.\n", a,b);

}

Если нам повезет, и вы получите такой же эффектНеопределенное поведение, как и я, теперь вы узнали кое-что о том, где заканчивается 0 в конце строки оператора. А именно, в одном из байтов переменной b.

С предложенным вводом вы, вероятно, получите 2 и 256. 2 выжило, 257 получил нулевой байт, обнуляемый, и в итоге получилось 256.

Также попробуйте ввести 2 3 и "+ A". Вы знаете, что «A» имеет значение ascii 65, не так ли?

В качестве последнего совета изучите эту статью. Это очень полезно для всего, что вы хотите прочитать.
http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

...