2015-08-03 18 views
5

Cuốn sách C của người mới bắt đầu mà tôi đang đọc đã khiến tôi bối rối về phương thức getchar() và thứ tự bộ đệm (đặc biệt khi nó liên quan đến dòng mới). Nó nói,getchar() và thứ tự bộ đệm

Loại bỏ phím Enter là một vấn đề mà tất cả các lập trình viên bắt đầu C phải đối mặt. Hãy xem xét các phân đoạn sau của một chương trình:

printf("What are your two initials?\n"); 
firstInit = getchar(); 
lastInit = getchar(); 

Bạn sẽ nghĩ rằng nếu người dùng gõ GT, các G sẽ đi trong biến firstInitT sẽ đi trong lastInit, nhưng đó không phải những gì xảy ra . Đầu tiên getchar() không kết thúc cho đến khi người dùng nhấn Enter vì G sẽ chuyển đến bộ đệm. Chỉ khi người dùng nhấn Enter thực hiện việc G rời khỏi bộ đệm và chuyển đến chương trình — nhưng thì phím Enter là vẫn còn trên bộ đệm! Do đó, số getchar() thứ hai gửi rằng Enter (\n) đến lastInit. T vẫn còn lại cho getchar() tiếp theo (nếu có).

Thứ nhất, tôi không hiểu lời giải thích của tác giả là tại sao \n đi vào lastInit chứ không phải là T. Tôi đoán vì tôi đang hình dung bộ đệm là “ trước tiên trước tiên ra ”. Dù bằng cách nào tôi không hiểu logic đằng sau thứ tự tác giả đang trình bày — nếu người dùng nhập G, sau đó T, sau đó Enter, làm cách nào để G bị bắt trước getchar() đầu tiên, Enter (dòng mới) bị bắt số getchar() thứ hai và T bị bắt bởi số thứ ba getchar()? Khó hiểu.

Thứ hai, tôi đã thử bản thân mình (Ubuntu 14.04 chạy trên VMWare trong Windows 8.1, trình soạn thảo văn bản Mã :: Khối, trình biên dịch gcc), và tôi nhận được kết quả chung chính xác mà tác giả nói không xảy ra !: Số G chuyển đến firstInitT chuyển đến lastInit. Đây là mã của tôi:

#include <stdio.h> 

main() 
{ 
    char firstInit; 
    char lastInit; 

    printf("What are your two initials?\n"); 

    firstInit = getchar(); 
    lastInit = getchar(); 

    printf("Your first initial is '%c' and ", firstInit); 
    printf("your last initial is '%c'.", lastInit); 

    return 0; 
} 

Và kết quả là:

What are your two initials?
GT
Your first initial is 'G' and your last initial is 'T'.

tôi cũng đã tạo ra một chương trình theo dõi, mà dường như để xác nhận xuống dòng mà đi ra khỏi bộ đệm cuối cùng:

main() 
{ 
    char firstInit; 
    char lastInit; 
    int newline; 

    printf("What are your two initials?\n"); 

    firstInit = getchar(); 
    lastInit = getchar(); 
    newline = getchar(); 

    printf("Your first initial is '%c' and ", firstInit); 
    printf("your last initial is '%c'.", lastInit); 
    printf("\nNewline, ASCII %d, comes next.", newline); 

    return 0; 
} 

Và kết quả là:

What are your two initials?
GT
Your first initial is 'G' and your last initial is 'T'.
Newline, ASCII 10, comes next.

Vì vậy, tôi thiếu cái gì đây hoặc là tác giả sai?(hoặc là phụ thuộc trình biên dịch này — mặc dù tác giả đã không nói như vậy)?

Sách: C Lập trình Absolute Beginner Hướng dẫn, 3rd edition, Greg Perry, © năm 2014, Ubuntu 14.04, gcc biên dịch phiên bản 4.8.4

+0

Hãy thử nhập "G T ". –

+0

@AndrewHenle Tôi chỉ có thể nhập G trước khi chương trình chấm dứt. Trong trường hợp này firstInit chụp G và lastInit bắt dòng mới, đó là những gì tôi mong đợi. – yroc

+1

Chỉ cần nhập "GT ". BTW 'main' được định nghĩa không đúng, phải là' int main (void) '. –

Trả lời

3

Tác giả được mô tả kịch bản mà người dùng gõ "G < nhập > T < nhập > ".

+0

Điều đó chắc chắn sẽ giải thích nó, và bạn có lẽ đúng rằng đây là ý định của tác giả. Nhưng sau đó từ ngữ gây hiểu nhầm theo ý kiến ​​của tôi: "... nếu người dùng nhập GT" không giống như "... nếu người dùng nhập G T ". Cảm ơn bạn. – yroc

2

Đây là một ví dụ khác. Vòng lặp menu sẽ lặp lại hai lần cho mỗi lựa chọn được nhập 1, 2 hoặc 3.
Xóa nhận xét, //, từ //while ((getchar () != '\n')) {} và bộ đệm sẽ bị xóa sau mỗi lần nhập và menu sẽ chỉ lặp lại một lần cho mỗi mục nhập.

#include <stdio.h> 

int main() 
{ 
    char *menu[] = { "1. first", "2. second", "3. third", "4. Exit"}; 
    int choice = 0; 
    int each = 0; 

    do { 
     for (each = 0; each < 4; each++) { 
      printf ("%s\n", menu[each]); 
     } 
     printf ("\tenter choice 1-4\n"); 
     choice = getchar (); 
     //clear the buffer 
     //while ((getchar () != '\n')) {} 
     printf ("you entered %d %c\n", choice, choice); 
    } while (choice != '4'); 
    return 0; 
} 
+0

Cảm ơn bạn tôi sẽ dùng thử! – yroc

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