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ácG
sẽ đi trong biếnfirstInit
vàT
sẽ đi tronglastInit
, nhưng đó không phải những gì xảy ra . Đầu tiêngetchar()
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ệcG
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
) đếnlastInit
.T
vẫn còn lại chogetchar()
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 firstInit
và T
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
Hãy thử nhập "G T ". –
@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
Chỉ cần nhập "GT". BTW 'main' được định nghĩa không đúng, phải là' int main (void) '. –