簡體   English   中英

C-fscanf in while循環跳過用戶輸入

[英]C - fscanf in while loop skips user input

所以我運行程序,它執行打印,從鍵盤讀取我鍵入的字符,切換到適當的情況,但不是返回到循環的頂部並停止在fscanf以接收進一步的輸入,它的行為就像它已經收到一個新的線或什么東西並切換到默認情況,再次返回到循環的頂部並期待輸入。 我錯過了什么?

這是代碼:

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

int main () {
  char *command;
  command = malloc (2);

  while (1) {
    printf ("Type help for usage\n");
    printf ("Enter command: \n");
    fscanf (stdin,"%c",command);

    switch (command[0]) {
      case 'a':
        printf ("a\n");
        break;

      case 'h':
        printf ("help\n");
        break;

      default:
        printf ("default\n");
    }
  }
  return 0;
}

那是因為當你輸入a ,你也輸入一個換行符'\\n' ,然后%c在第二遍輸入換行符。

如果你分配char command[2]; 並使用scanf("%1s", command) ,你應該避免大多數問題。 %s轉換說明符跳過前導空格, 1將輸入限制為單個非空白字符,這應該可以幫助您充分利用。

就個人而言,我仍然使用:

 char line[4096];

 while (fgets(line, sizeof(line), stdin) != 0)
 {
     char command[2];
     if (sscanf(line, "%1s", command) == 1)
         ...got a command...
     else
         ...failed...
 }

更喜歡這種情況的一個原因是它每次都會吃換行符,但更重要的是,如果出現問題,您可以在錯誤報告中使用整行信息。

如果用戶輸入許多命令,則在2個輸入命令之間有換行符。 你必須在你的fscanf通過在字符串格式" %c"的開頭添加空格來捕獲這個換行符將允許這樣做

fscanf (stdin," %c",command);

您可以將command定義為char而不是指針:

 char command;

如果你這樣做, fscanf應改為

fscanf (stdin,"%c",&command);

switch (command) {
    switch (command[0]) {
      case 'a':
    printf ("a\n");
    fflush(stdin);
        break;

      case 'h':
    printf ("help\n");
    fflush(stdin);
        break;

      default:
    printf ("default\n");
    fflush(stdin);
    }
  }

您還可以使用Fflush來克服此問題

您應該使用函數fflush(stdin);釋放輸入緩沖區fflush(stdin); 之后,您將能夠進行下一個輸入。

暫無
暫無

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

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