2012-12-15 3 views
0

곱셈 테이블 사용자가 번호를 선택하고 테이블을 표시 한 후. 하지만 내 코드에서 스위치가 작동하지 않는 이유는 무엇입니까? 예 :스위치에 잠시 들어가기

#include<stdio.h> 

int main(){ 

int x,y=10; 

printf("Welcome!\n"); 
printf("choose a number for multiplication table \n"); 
scanf("%i",&x); 


switch(x){ 

    case '1': 
     while(y) 
     { 

      printf(" %i * %i = %i \n",x,y,x*y); 
      y--; 


     } 
    };break;  
} 
} 
+1

스위치 밖에서 휴식하는 것이 어떻습니까? – chris

+1

귀하의 경우는 숫자 값 1이 아닌 문자 1의 ASCII 값입니다. 이것이 의도입니까? – Borgleader

+0

또한 문자 "1"을 숫자 값과 비교하여 스위치가 잘 작동하지 않습니다. –

답변

2

'1'int1 아니다 (하지만 '1' 리터럴 문자와 49int 값을 갖는다) 그래서 그것을 스위치의 경우를 입력하지 않습니다 의심. 리터럴 정수 1에 경우 레이블을 변경 :

if (1 == scanf("%i", &x)) 
{ 
} 
+0

자신, 감사합니다! 지금 나는 –

4

당신은 여분이 :

case 1: 

int을 보장하기 위해 scanf()의 반환 값을 확인 읽고되었고 이후의 코드는 x이 unitialised 처리되지 }

case '1': 
    while(y) 
    { 

     printf(" %i * %i = %i \n",x,y,x*y); 
     y--; 


    } 
};break; // This break is outside of your switch 

또한 정수 값이 아닌 1의 문자 값을 사용하고 있습니다. ue of 1. case도 일치하도록 변경해야합니다.

+0

을 깨닫는다. 휴식은 안에 있지만 여전히 작동하지 않는다 : \ –

+0

@ AnaIzabelA.Jacobsen 내가 언급했듯이, 당신은 또한''1''을 고치고 그것을'1'로 바꿀 필요가있다. –

1

C++ 스위치의 경우 구문 : 추가 브레이스의에도 불구하고

switch (x) { 

    case 1 : //x is an integer 

    while(y) 
    { 
     printf(" %i * %i = %i \n",x,y,x*y); 
     y--; 
    } 
    break; //Inside the case 


} 
1

, 당신은 switch 문에서 옵션을 사용하여 입력 값을 비교하는 방식에 문제가있는 것입니다. 다음 라인에서는 :

scanf("%i",&x); 

컴파일러 프로그램 여기서 정수 값을 예상하는 통지되므로, 표준 입력 1의 사용자 타입은 0x01로 X 변수에 저장됩니다. 유감 스럽지만 여기에 :

x 변수가 0x31 인 '1'(ASCII 문자)과 비교됩니다. 따라서 귀하의 사례 명세서는 다음과 같아야합니다 :

case 1: 

물론 case 문에는 ASCII 문자를 사용할 수 있습니다. 입력을 char 데이터 형식으로 처리하도록 프로그램을 수정할 수 있습니다.

scanf("%c",&x); 

그런 다음 0x31이 x 변수에 저장되고 '1'과 비교하면 의미가 있습니다. 그러나 프로그램의 기능을 손상시키지 않으려면 x를 int 값으로 변환해야한다는 것을 기억해야합니다.

x -= 0x30; 

첫 번째 방법은 훨씬 편리합니다.

관련 문제