[英]peek at input buffer, and flush extra characters in C
如果要在C中接收一個字符輸入,如何檢查是否發送了額外的字符,如果發送了,如何清除?
是否有一個功能類似於getc(stdin)的函數,但是它不會提示用戶輸入字符,因此我可以放while(getc(stdin)!=EOF);
? 還是一個偷看緩沖區中下一個字符的函數,如果它不返回NULL(或那里的任何東西),我可以調用一個(另一個)函數來沖洗標准輸入?
string, up until the newline? 所以,現在,scanf似乎可以解決問題,但是有沒有辦法讓它讀取字符串,直到換行? 而不是到最近的空格? 我知道我可以將“%s%s%s”或任何其他內容放入格式字符串,但是我可以處理任意數量的空格嗎?
您無法刷新輸入流。 如果這樣做,您將調用未定義的行為。 最好的選擇是:
int main() {
int c = getchar();
while (getchar() != EOF);
return 0;
}
要使用scanf
magic:
#include <stdio.h>
#include <stdlib.h>
#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256
int main() {
char buf[ BUFSZ + 1 ];
int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
if (!feof(stdin)) {
getchar();
}
while (rc == 1) {
printf("Your string is: %s\n", array);
fflush(stdout);
rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
if (!feof(stdin)) {
getchar();
}
}
return 0;
}
我們可以創建一個清除鍵盤緩沖區的函數,如下所示:
#include <stdio.h>
void clear_buffer(){
char b;
//this loop take character by character in the keyboard buffer using
//getchar() function, it stop when the variable "b" was
//enter key or EOF.
while (((b = getchar()) != '\n') && (b != EOF));
}
int main()
{
char input;
//get the input. supposed to be one char!
scanf("%c", &input);
//call the clearing function that clear the buffer of the keyboard
clear_buffer();
printf("%c\n",input); //print out the first character input
// to make sure that our function work fine, we have to get the
// input into the "input" char variable one more time
scanf("%c", &input);
clear_buffer();
printf("%c\n",input);
return 0;
}
您可以使用getline
讀取整行輸入。
或者(針對您的原始問題),您可以在stdin上調用select
或poll
以查看是否還有其他字符要讀取。
今天,我遇到了類似的問題,並且發現了一種可行的方法。 我不知道您的情況的詳細信息,所以不知道它是否對您有用。
我正在編寫一個例程,該例程需要從鍵盤獲取單個字符,並且該例程必須是三個特定的擊鍵之一(“ 1”,“ 2”或“ 3”)。 如果不是其中之一,則程序需要發送錯誤消息並循環返回以進行另一次嘗試。
問題是,除了我輸入的字符由getchar()返回之外,“ Enter”鍵擊(它將鍵擊發送到程序)還保存在輸入緩沖區中。 然后,該(非打印的)換行符由糾錯循環中的getchar()工具返回,進一步導致出現第二條錯誤消息(因為換行符既不是'1',也不是'2' ,也不是“ 3”。)
問題變得更加復雜,因為我有時會超越自己,而不是輸入單個字符,而是輸入這些選項之一要求的文件名。 然后我在緩沖區中有一串不需要的字符,導致一串錯誤消息向下滾動到屏幕。
不酷
但是,似乎已解決的問題如下:
c = getchar(); // get first char in line
while(getchar() != '\n') ; // discard rest of buffer
第一行是實際使用我輸入的字符的行。 第二行處理輸入緩沖區中殘留的所有殘渣。 它只是創建一個循環,一次從輸入緩沖區中提取一個字符。 語句循環時沒有指定要執行的操作。 它只是讀取一個字符,如果不是換行符,則返回下一個字符。 當找到換行符時,循環結束,並繼續執行程序中的下一個業務訂單。
使用需要大量字符(大於1個,可能是256個)的讀取,並查看實際返回了多少個字符。 如果您獲得不止一個,那您就知道了; 如果您只有一個,那就足夠了。
您無需提及平台,這很快就會變得非常棘手。 例如,在Unix(Linux)上,常規機制將返回一行數據-可能是您要輸入的一個字符和一個換行符。 或者,也許您說服用戶鍵入^ D(默認)來發送前面的字符。 或者,也許您使用控制功能將終端置於原始模式(例如vi
和emacs
類的程序)。
在Windows上,我不確定-我認為有一個getch()
函數getch()
您的需求。
為什么不使用scanf而不是getc,通過使用scanf,您可以獲得整個字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.