簡體   English   中英

窺視輸入緩沖區,並在C中刷新多余的字符

[英]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上調用selectpoll以查看是否還有其他字符要讀取。

今天,我遇到了類似的問題,並且發現了一種可行的方法。 我不知道您的情況的詳細信息,所以不知道它是否對您有用。

我正在編寫一個例程,該例程需要從鍵盤獲取單個字符,並且該例程必須是三個特定的擊鍵之一(“ 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(默認)來發送前面的字符。 或者,也許您使用控制功能將終端置於原始模式(例如viemacs類的程序)。

在Windows上,我不確定-我認為有一個getch()函數getch()您的需求。

為什么不使用scanf而不是getc,通過使用scanf,您可以獲得整個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM