2011-09-01 4 views
2

나는 사용자가 이름, 근무 시간 및 시간당 급여를 입력하는 학교용 프로그램을 작성 중입니다.fgets() 생략 된

int main() 
{ 
    char name[SIZE]; 
    char selection = 'Z'; 
    int hoursWorked = 0, 
     counter = 0, 
     flag = 1; 
    float hourlyRate = 0.0; 
    const float otRate = 1.5; 
    const int week = 40; 

    while (flag == 1) 
    { 
     system ("cls"); 
     printf ("\n\tP A Y R O L L P R O G R A M\n"); 
     printf ("---------------------------------------------\n"); 
     printf ("\t(A) - New Payroll Info\n\t(B) - Display Payroll\n\t(C) - Quit\n\t"); 
     scanf (" %c", &selection); 
     selection = toupper (selection); 
     switch (selection) 
     { 
     case 'A': 
      system ("cls"); 
      printf ("Enter Employee Name: "); 
      fgets (name, SIZE, stdin); 
      strip_newline(name, 50); 
      printf ("\nEnter Hourly Rate: "); 
      scanf ("%f", &hourlyRate); 
      printf ("\nEnter Hours Worked This Week: "); 
      scanf ("%d", &hoursWorked); 
      system ("pause"); 
      break; 

크기는 50이며, STDIO.H & stdlib.h 포함된다. 컴파일하고 A 스위치로 이동하면 fgets() 입력을 건너 뛰고 "Enter Hourly Rate: "scanf()으로 바로갑니다. fgets() 앞에 scanf()을 넣어 주문 변경 시도를했지만 아무 소용이 없습니다.

+2

[the c-faq] (http://c-faq.com/)의 12 절을 읽으십시오. 그리고 여러분이 이미 있기 때문에, 다른 섹션들도 읽어보십시오 :-) – pmg

답변

4

scanf 호출은 입력 버퍼에 개행 문자를 남겼습니다. 결과적으로 fgets 호출이 이루어지면 해당 줄 바꿈을 읽고 반환됩니다.

위의 pmg의 의견대로 C FAQ에서 Question 12.18a에 대한 답변을 확인하십시오.

+1

내 대답은 입력 버퍼를 지우려면 fflush (stdin) – Sean

+1

내가 그 반대 것이 좋습니다. 'fflush (stdin)'은 명시되지 않은 동작을합니다 ... 많은 컴파일러가 예상대로 해석하지만 일부 컴파일러는 문제를 일으킬 수 있습니다. 휴대 성은 학교 과제와 관련이 없을 수도 있지만 나쁜 습관은 제거되는 것보다 훨씬 쉽게 형성됩니다. 대안으로 scanf의 다음과 같은 것을 제안합니다 : –

+0

'scanf ("% c % * [^ \ n]", & selection); assert ('\ n'== getchar());'물론 assert는 선택 사항이지만 (getchar()은 그렇지 않다). 나는 그저 개심성약을 먹고 있는지를 확인하고 싶었고 우연히 다른 성격을 먹지는 않았다. 내가 추가 한 % * [^ \ n]은 기본적으로 "개행이 아닌 모든 것을 일치시킵니다"([^ \ n] 패턴) "그러나 어떤 변수에도 할당하지 않습니다"(*가 그 것입니다). –

3

scanf은 줄의 끝에서 반환을 먹지 않을 것이므로 첫 번째 fgets로 전달됩니다. 개인적으로, 나는 scanf가 싫다. fgets를 사용하고 sscanf를 사용하여 줄을 분석하는 것이 더 좋다.

+0

그러나 sscanf를 숫자 데이터에 사용할 때는주의하십시오. 오버플로 (예 : INT_MAX를 초과하는 입력 값으로 "% d"사용)의 동작은 정의되지 않습니다. –

+0

@Paul Tomblin - 오하이오, 그 이름 위에 많은 매우 재미있는 a.s.r을 기억합니다. 당신은 전설입니다 :) –

+0

고마워, @ 톰. 나는 여전히 ASR에 가깝다. –