2013-10-27 5 views
0

У меня проблема. Когда я объявляю целое число «x», программа работает правильно, но когда я удаляю «x», это показывает мне странный результат.Зачем определять 'x' int (C)

#include <stdio.h> 
    #include <conio.h> 
    main() 
    { 
     int a,b,x; 
     char ras; 
     printf("Insert a: "); 
     scanf("%d", &a); 
     printf("Insert b: "); 
     scanf("%d", &b); 
     printf("Sum or multuply: (s/m)"); 
     scanf("%s", &ras); 
     if (ras=='s') 
     { 
      printf("Sum is :%d", a+b); 
     } 
     else if (ras=='m') 
     { 
      printf("Multiply is :%d", a*b); 
     } 
     getch(); 
    } 
+2

снять заднюю '**' в объявлении 'Int ** х **'. – Leonardo

+3

'scanf ("% s ", &ras);' должен быть 'scanf ("% c ", &ras);' –

+1

@Leonardo Я думаю, что он использует '**' для акцента. Это не в его реальном коде. :) – rightfold

ответ

2

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

В вашей конкретной реализации так получилось, что 0-байтный будет просто переопределять переменную x, если эта переменная существует. Если это не означает, что вы переопределяете что-то еще, что приводит к вашему странному результату.

Для чтения одного символа вы должны использовать %c, а не %s.

0

Это потому, что ваш код вызывает неопределенное поведение, и, по-видимому, он делает это «смешно».

Причина UB является то, что спецификатор %s преобразования делает scanf() добавить завершающую NUL символ за персонаж просто сканируется, но нет места для него, поэтому он пишет нераспределенную память ...


Используйте вместо этого %c. Еще лучше, избавиться от scanf() полностью, это зло. Вместо этого используйте разумную функцию, например getchar().

Смежные вопросы