2013-07-06 2 views
0

이제 C 프로그래밍 과정을 수강 중이므로 C에 대해 완전히 새내기. 코드가 제대로 작동하지 않아 두통이 생깁니다. 여기C - getchar()로 예기치 않은 문자 읽기.

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

int main() 
{ 
    printf("\n\nList of Paycodes:\n"); 
    printf("1 Manager\n"); 
    printf("2 Hourly worker\n"); 
    printf("3 Commission Worker\n"); 
    printf("4 Cook\n\n"); 

    bool cd=true; 
    float weekmoney; 
    char name[100]; 
    char code[10]; 
    int codeint; 
    char cl; 
    int cllen; 
    char hw[5]; 
    int hwint; 
    int salary=0; 

    while(cd){ 
     printf("Enter employee name: "); 
     fgets(name,100,stdin); 
     name[strlen(name)-1]='\0'; // nk remove new line lepas user input 
     printf("Enter employee\'s paycode: "); 
     strcpy(code, ""); 
     fgets(code, 10, stdin); 
     codeint = atoi(code); 
     if(codeint > 4 || codeint <= 0){ 
      printf("\nPlease enter correct employee\'s paycode!\n\n"); 
      continue; 
     }else if(codeint == 1){ 
      printf("%s\'s pay for this week (RM): 500.00\n\n", name); 
     }else if(codeint == 2){ 
      printf("Enter hours work this week: "); 
      fgets(hw, 5, stdin); 
      hwint=atoi(hw); 
      if(hwint > 12){ 
       hwint -= 12; 
       salary += 500; 
      } 
      if(hwint > 0){ 
       for(int i=0;i < hwint;i++){ 
        salary += 100; 
       } 
      } 
      printf("%s\'s pay for this week (RM): %d\n\n", name, salary); 
     }else if(codeint == 3){ 
      printf("Enter %s\'s this week sales (RM): ", name); 
      scanf("%f",&weekmoney); 
      printf("%s\'s pay for this week (RM): %.1f\n", name, (((5.7/100)*weekmoney)+250)); 
     } 
     while(true){ 
      printf("Do you wish to continue? (Y = Yes, N = No): "); 
      cl=getchar(); 
      getchar(); 
      if(tolower(cl) == 'y'){ 
       break; 
      }else if(tolower(cl) == 'n'){ 
       cd=false; 
       break; 
      }else{ 
       printf("\nPlease enter correct value!\n\n"); 
       continue; 
      } 
     } 
    printf("\n"); 
    } 
} 

문제 및 설명입니다

여기에 문제가 보여 내 코드입니다.

내 코드는 문제 섹션을 통해 실행되지 않을 경우이 부분의 코드를 통해 실행 내 코드

printf("Enter %s\'s this week sales (RM): ", name); 
scanf("%f",&weekmoney); 
printf("%s\'s pay for this week (RM): %.1f\n", name, (((5.7/100)*weekmoney)+250)); 
여기

cl=getchar(); 
getchar(); 
if(tolower(cl) == 'y'){ 
    break; 
}else if(tolower(cl) == 'n'){ 
    cd=false; 
    break; 
}else{ 
    printf("\nPlease enter correct value!\n\n"); 
    continue; 
} 

오류가 발생합니다이 코드는하지만, 작동

경우 잘. 거의 한 시간 동안 솔루션 + 디버그를 찾으려고했지만 여전히 내 문제를 해결하기위한 올바른 해결책을 찾지 못했습니다. 여기

+0

이와 같은 문제를 디버깅 할 때 발견 한 문자를 '잘못'인쇄하는 데 도움이 될 수 있습니다. 예를 들어'printf ("% d (% c) \ n", cl, isprint (cl)? cl : '.');)는 예상하지 못한 문자를 출력하고 10 문제가 무엇인지 생각해보십시오. 또한 EOF (그리고'scanf()'에서 반환 값을 확인해야한다. 'cl'의 타입을 바꿀 필요가 있습니다; 'getchar()'는 모든 char 값과 EOF를 반환해야하기 때문에'char'가 아닌'int'를 반환하기 때문에 EOF를 정확하게 처리 할 수 ​​있도록'int' 여야합니다. –

답변

0

getchar(); 이 버퍼 설명에 새로운 라인이

printf("Enter %s\'s this week sales (RM): ", name); 
scanf("%f",&weekmoney); 
getchar(); 
printf("%s\'s pay for this week (RM): %.1f\n\n", name, (((5.7/100)*weekmoney)+250)); 

감사합니다 유 하오처럼 있도록 scanf와

후 새로운 라인 버퍼를 제거합니다. : D

+1

사용자가 주간 판매 값 다음에 공백 (또는 다른 문자)을 입력하지 않는 한 작동합니다. 입력 행을 읽으려면'fgets()'를 사용하고, 구문 분석하려면'sscanf()'를 사용하는 것이 더 좋습니다. –

2
scanf("%f",&weekmoney); 

, 만약 입력 숫자를 누르 들어가면 scanf 숫자를 처리하지만, 새로운 라인 버퍼에 계속하고, 다음 getchar 의해 처리 될 것이다. 다음을 사용하여 \n과 일치시킬 수 있습니다.

scanf("%f%*[\n]", &weekmoney); 

그러나 scanf 많은 문제 가능한 fgets 같은 다른 기능을 사용할 수있다.

+0

버퍼에 새 줄이 표시되지 않도록하려면 어떻게해야합니까? –

+0

* [\ n]이 (가) 나에게 효과가 없습니다. 하지만 getchar(); scanf ("% f", & weekmoney) 이후; 나를 위해 아주 잘 작동하고 그것은 내 문제를 해결한다 : D –

+0

'% * [\ n]'은 억제 된 할당 스카 셋 변환 명세이다. '%'에주의하십시오. –