2014-11-26 2 views
0

입력이 2 개의 값 'M'또는 'F'중 하나 여야하는 프로그램을 만들어야합니다. 여기 C에서 문자열을 정확하게 비교

내가 내가 정수 선택 입력을 할 수 있었다 알지만, 가능하면이 나중에 재활용하고자하는

do 
{ 

    printf("What is your Gender? (M for Male - F for Female) "); 
    fgets(GenderValue, 16, stdin); 

    if (GenderValue[0] == '\n') 
    { 
      printf("Try again"); 
      getch(); 
      system("cls"); 
      loop=1; 
    } 
    else 
    { 
      loop = -1; 
    } 
    if (GenderValue == "M"); 
    { 
      loop =-1; 
    } 
    else if(GenderValue == "F"); 
    { 
      loop=-1; 
    } 

    else 
    { 
      printf("Try again"); 
      getch(); 
      system("cls"); 
      loop=1; 
    } 



} 
while(loop > 0); //Checks for NULL input 

printf("Gender: %s",GenderValue); 

을 입증하기 위해 만든 프로그램 세그먼트입니다.

지금까지는 프로그램에서 성별 값 비교 "오류"를 호출합니다. 다음에 무엇을해야할지 모르겠지만 괜찮습니다. 문자열을 비교하는 함수를 찾을 수는 있었지만 실제로는 복잡하지 않으려 고합니다. 내 코드.

Edit : Duplicate ?, Really ?, 주어진 예제는 나를 돕는 데 거의 사용되지 않습니다.

편집 2 : 문제가 발견되었습니다. 이제 if 문 옆에 문제가 발견되었습니다. 이제 해결되었습니다. 그러나 진지하게, 아무도 이것을 발견하지 못했습니까?

+1

어떻게'GenderValue'가 선언 되었습니까? –

+0

"지금까지는 프로그램에서 성별 값 비교를"오류 "라고 부릅니다. 사실 아니다. 1. 이것들은 * 컴파일러 오류 * 2이며 적어도 첫 번째 오류를 보여 주어야합니다. 보통 컴파일러는 * 무엇이 잘못되었는지 * * *를 알려줍니다. – usr2564301

+0

'GenderValue [0] == 'M '' 또는''GenderValue [0] =='F'''도 사용할 수 있습니다. –

답변

1
  1. GenderValue이 문자열 인 경우, GenderValue == "M"이 잘못되었습니다. 문자열은 ==으로 컴파일되지 않아야합니다. strcmp()을 사용하십시오. GenderValue는 하나의 문자 인 경우

  2. 는 [이 경우, IMO의 적합, 비교, 당신은

    처럼 뭔가를 할 수 [하나 개의 문자 입력을 고려] 당신의 사건을 위해 GenderValue == 'M'

으로 수행해야합니다 위의 코드에서

fgets(GenderValue, 16, stdin); 
switch(GenderValue[0]) 
{ 
    case '\n': 
       //your code 
       break; 
    case 'M': 
    case 'm': 
       //your code 
       break; 
    case 'F': 
    case 'f': 
       //your code 
       break;     
    default: 
} 

세 이점

  • 당신은 \n 정확히 하나 개의 문자 입력은 입력의 상한/사건에 대해 걱정
  • 필요로 간주되지 않습니다 fgets()
  • 에 의한 꼬리 끌림 제거하는 방법에 대한 걱정 할 필요가 없습니다.
6

문자열을 비교하는 데 strcmp을 사용합니다. 비교 연산자 ==을 사용하면 포인터을 비교합니다.

그러나 fgets은 줄 바꿈 개행을 문자열에 남겨 둡니다. 예를 들어 다음과 비교해야합니다. "M\n" 또는 줄 바꿈 문자가 있으면 제거하십시오.

또한 scrcmp대소 문자 인 문자열 "M" 문자열 "m" 동일되지 않는다.


scanf 대신 입력을 단일 문자로 읽으십시오. tolower (또는 toupper) 대소 문자를 구분하지 않습니다.

그러나 scanf을 사용하면 특히 다른 문자를 읽는 데 다시 사용하는 경우 다른 문제가 발생합니다. 그 이유는 Scanf이 입력 버퍼에 개행을 남겨서 "%c" 형식으로 가능한 새 문자 scanf을 호출하여 해당 개행을 읽게하기 때문입니다. 매우 간단한 해결책이 있습니다. scanf에게 " %c"을 사용하여 선행 공백을 읽고 구분합니다.

0

시도 당신은 또한 "string.h"

+0

그래서 if 문은 정확히 같을까요? –

+0

음, 정확히 무엇을하고 싶은지 잘 모르겠습니다. 언뜻보기에 첫 번째 else는 루프를 -1로 설정하고 이후의 조건이 유지 되더라도 변경되지 않습니다. – skortzy

+0

M과 F. 만 허용하는 문을 원합니다. GenderValue는 문자열입니다. –

1

(strcmp(GenderValue, "M") == 0)

으로 (GenderValue == "M") 교체 포함해야 할 수도 있습니다 !strcmp(GenderValue, "M\n")

!strcmp(GenderValue, "F\n")GenderValue == "F"GenderValue == "M" 교체

(strcmp(GenderValue, "F") == 0)

으로 (GenderValue == "F") 교체
+0

'GenderValue'에서'\ n'을 제거하지 않으면 작동하지 않습니다. –

+0

또는 "M \ n"과 비교할 수 있습니다. 내 프로그램이 여전히 적합성을 유지하고 있습니다. –

0

문자열을 비교해야 할 때마다 문자열 비교 함수 (strcmp (""))를 사용하십시오.