2013-07-16 3 views
-5

Рассмотрите два кода. Почему они дают разные выходы, хотя одно значение hass было присвоено i, 'i' - символ в обоих кодах.Корпус выключателя работает по-другому

первый код -> (здесь присваивается значение I непосредственно)

void main() 
{ 
    char i=3; 

    clrscr(); 
    switch(i) 
    { 
     default : printf("\nHi..\n"); 
      break; 
     case 1:printf("\na"); 
     break; 
     case 2:printf("\nb\n"); 
     break; 
     case 3:printf("\nc"); 
      break; 
     } 
    } 

второй с помощью Printf-зсапЕ --->

void main() 
{ 
    char i; 
    printf("ENTER i"); 
    scanf("%c",&i); 
    clrscr(); 
    switch(i) 
    { 
     default : printf("\nHi..\n"); 
       break; 
     case 1:printf("\n\na"); 
     break; 
     case 2:printf("\nb\n"); 
     break; 
     case 3:printf("\nc"); 
      break; 
     } 
} 

во втором коде, когда им дает 3 как ввод, я получаю «Привет ..» в качестве вывода. Что заставляет эти два кода работать по-другому .. ??

ответ

0

Это не связано с оператором switch, а с функцией scanf.

Прочтите его документацию, т.е. scanf(3) справочная страница. См. Также this answer на очень близкий вопрос.

Обратите внимание, что символ '3' не кодируется как 3, но в 51 в ASCII

Научитесь включить все предупреждения и отладочную информацию (например, компилировать с помощью gcc -Wall -g) и научиться использовать отладчик (т.е. gdb)

+0

ya i knw that ... но почему значение, которое alot для c в первом коде .. не рассматривается как ASCII, как во втором случае. Хотя я не использовал одиночную инвертированную запятую ('), чтобы обозначить символ. Почему их отличие в том, как c присваивается значение. – DD24

+0

Пожалуйста, посмотрите, как я сказал, на [этот ответ] (http://stackoverflow.com/a/17668811/ 841108) –

1

После прочтения символа из стандартного ввода:

scanf("%c",&i); 

i будет содержать ASCII-код 3 (51), а не значение 3, что приводит к т на default филиал switch.

Решение объявить переменную, как int и используя

scanf("%d",&i); 

читать.

В первом примере вы присвоили i целочисленное значение 3, что не совпадает с назначением символа '3'. В C, когда вы присваиваете значение переменной char, это значение будет представлять собой код, специфичный для определенного символа (с учетом стандарта).

Во втором примере функция scanf прочитать символ из stdin, который был интерпретирован как характер из-за использования %c и присвоенного данной переменной кода, специфичная для чтения символа.

+0

ya i knw that ... но почему значение, которое al to c в первом коде .. не рассматривается как ASCII, как во втором случае. Хотя я не использовал одиночную инвертированную запятую (') для обозначения символа. . Почему их отличие в том, как c присваивается значение. – DD24

+0

@ DD24: Я завершил свой ответ в качестве объяснения. –

0

Изменить код

char i -> int i; 

scanf("%c",&i) -> scanf(" %d",&i); 
+0

ya i knw that ... но почему значение, которое al to c в первом коде .. не рассматривается как ASCII, как во втором случае. Хотя я не использовал одиночную инвертированную запятую (') для обозначения символа. почему их отличие в том, как c присваивается значение. – DD24

+0

Вы можете изменить свой первый пример, чтобы соответствовать второму примеру, выполнив 'char i = '3';' вместо 'char i = 3;' –

+0

«3» совпадает с кодом ASCII 0x33. –

1

В первом вы используете

char i = 3 

Но когда вы используете зсапЕ вас в основном используют:

char i = '3' 

Эти два содержат разные значения

См. Следующее ASCII http://www.asciitable.com/

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