2015-04-07 30 views
5

tôi đã viết chương trình đơn giản này cho thực hành:Tại sao câu lệnh này được in hai lần trong vòng lặp?

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

#define CLASSES 3 
#define STUDENTS 4 
int grades[CLASSES][STUDENTS]; 

int main(void) 
{ 
    int i = 1; 
    char t,k; 
    while(i == 1) 
    { 
     printf("\n\n\nMENU:\nEnter the grades(E)\nReport Grades(R)\nQuit(Q)\nYour choice: "); 
     k = toupper(getchar()); 
     printf("Input entered... %c\n", k); 
     switch(k) { 
      case 'E' : 
       printf("Entering the grades..\n"); 
       break; 
      case 'R' : 
       printf("Reporting the grades...\n"); 
       break; 
      case 'Q' : 
       printf("Quitting the program...\n"); 
       exit(0); 
       break; 
      default: 
       printf("ERROR: %c: Incorrect menu option\n", k); 
       break; 
     } 

    } 
    return 0; 
} 

Khi tôi chạy này, lần đầu tiên tôi được yêu cầu nhập vào một sự lựa chọn. Nếu tôi nhập 'E' hoặc 'R', nó đi vào khối 'trường hợp' tương ứng nhưng trong lần lặp tiếp theo trong vòng lặp while, nó không chờ tôi nhập vào lựa chọn của tôi. Thay vào đó, nó giả định tôi đã nhập "NULL" và yêu cầu lần thứ ba nhắc của tôi. Điều này liên tục xảy ra mỗi khi tôi nhập một lựa chọn. Đây là đầu ra của chương trình này. Tôi đang thiếu gì ở đây?

host-mb:c_practice host$ ./asd 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: E 
Input entered... E 
Entering the grades.. 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Input entered... 

ERROR: 
: Incorrect menu option 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: R 
Input entered... R 
Reporting the grades... 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Input entered... 

ERROR: 
: Incorrect menu option 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Q 
Input entered... Q 
Quitting the program... 
host-mb:c_practice host$ 
+2

Vì bạn nhấn e, sau đó nhấn enter. Đó là hai nhân vật. – immibis

+0

'k = toupper (getchar());' -> 'k = toupper (getchar()); getchar();' một cho dòng mới. – BLUEPIXY

Trả lời

10

Điều này xảy ra vì bạn nhập một chữ cái và sau đó nhấn enter. Sử dụng một số khác getchar() để ăn dấu mới.

Vì vậy, thay đổi này:

k = toupper(getchar()); 

này:

k = toupper(getchar()); 
getchar(); // eat the trailing newline 

Khi người dùng đóng góp một cái gì đó, nó đi vào stdin (standard input) dòng và hệ thống đảm bảo để lưu trữ những gì người dùng đã gõ vào bộ đệm bên trong. Vì vậy, đây là những gì đã xảy ra với đang của bạn:

enter image description here

Vì vậy, giải pháp là ăn dấu xuống dòng!


Phục Sinh trứng lời khuyên:

Bạn sẽ nhận được điều này:

warning: implicit declaration of function ‘printf’ 

vì bạn thiếu của tiêu đề IO, do đó bạn nên thêm ở phía trên cùng của tập tin chính của bạn này:

#include <stdio.h> 

Tương tự bạn nên thêm:

#include <ctype.h> // for toupper() 
#include <stdlib.h> // for exit() 

Một giải pháp khác là sử dụng fgets(), xem câu hỏi này để biết thêm C - scanf() vs gets() vs fgets().


Tôi đã có một vấn đề tương tự như của bạn với scanf() và tôi đã vào vị trí của bạn, vì vậy tôi đã viết xuống solution vào thời điểm đó.

+0

Điều đó đã giúp ích. Cảm ơn. Vì vậy, mỗi khi tôi mong đợi một "nhập" từ người sử dụng, tôi cần phải ăn nó bằng cách sử dụng getchar(). – gixxer

+0

Chính xác! Nice catch và câu hỏi hay, bạn có +1 của tôi. @ gixxer – gsamaras

+0

Tôi đoán có một giải pháp khác, thay vì sử dụng getchar() 2 lần, tôi có thể sử dụng get() và tách '\ n' khỏi đầu vào. – gixxer

Các vấn đề liên quan