2012-08-23 4 views
1

편집 : getchar();을 추가해야했습니다. scanf 이후 ("% i", & 선택); 지금은 한 번만 묻습니다!입력을 받아 while 루프에서 비교하면 fgets입니까?

외관상으로는 케이스 스위치가 출력을 두 번 출력합니다. 케이스 밖의 함수를 호출하면 1을 출력하지만, 스위치 내부에서 호출하면 스위치가 두 번 출력됩니다.

무엇이 원인입니까? scanf 선택을 의심합니까?

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

     void test(); 
     void choose(); 
     int main(void) 
     { 
//if i call here its fine 
      test(); 
      choose(); 
      return 0; 
     } 

     void choose() 
     { 
      int choice; 

      do 
      { 
       printf("1 - Testing if double ask\n"); 
       printf("2 - Exit\n"); 
       printf("Please enter your choice: ");  
       scanf("%i", &choice); 

       switch(choice) 
       {//but pressing 1 here asks twice? 
        case 1:   
         test(); 
         break; 
        default: 
         if(choice !=2) 
          printf("Input Not Recognized!\n"); 
         break;   
       } 
      } 
      while(choice !=2); 
      if(choice == 2) 
       printf("Ciao!"); 
     } 
     void test() 
     { 
printf("HELLO"); 
       char *name = malloc (256); 

       do  
       { 
        printf("Would you like to continue (y/n)\n"); 
        fgets(name, 256, stdin); 
       } 
       while(strncmp(name, "n", 1) != 0); 
       free (name); 
     } 
+0

한 문자 또는 'strcmp()'에 작은 따옴표를 사용하십시오 (두 문자가 같으면 '0'이됩니다). – alex

+0

fgets 다음에 이름을 출력하고이를 게시물에 추가하십시오. – MWB

+0

@MWB ok, 그 게시 – Dog

답변

4

첫째 : 당신은 비교 연산자 !===와 C 문자열을 비교할 수 없습니다. 이 경우 strcmp을 사용해야합니다.

더욱이이 경우에는 do { ... } while 루프가 더 유용 할 것입니다. 사용자가 입력을 추가하기 전에 name을 한 번 확인합니다.

다음으로 알고 있어야 할 점은 fgets이 입력에 개행을 유지하므로 strcmp의 용도로이 문제를 해결해야한다는 것입니다.

+0

문자열을 인쇄 할 수 있습니까? 내 말은 "a"라고 쓰여진 편지를 입력하면 printf ("a \ n")와 같을 것입니다. – Dog

+0

맞습니다. 입력 문자열은 printf와 같습니다. – pb2q

+0

아, 알았습니다. 텍스트 파일에 줄 단위로 저장해야하므로 – Dog

1

문자열 비교는 C에서와 같이 작동하지 않으므로 string.h에 strcmp를 사용해야합니다.

또는 이름의 첫 번째 문자를 볼 수도 있습니다.

while(name[0] != 'n') 
+0

나는 (name [0]! = 'n'동안 시도했지만 고마워요.하지만 여전히 두 번 묻고 있습니다. – Dog

+0

개행을 할 때 – MWB

관련 문제