簡體   English   中英

用scanf進行的驗證檢查在循環內不起作用

[英]Validation check with scanf does not work inside a loop

我試圖提供一種功能來檢查用戶的輸入,並讓他們在輸入錯誤的輸入時再次嘗試。

因此,當我在函數中輸入錯誤的輸入時,它將使我陷入無限循環。 我該如何解決?

我只允許使用getcharscanf作為用戶輸入。

int sizeOfField()
{
    int size,inputCheck,flag=0;

    while (!flag)
    {
        inputCheck= scanf(" %d ", &size );
        if ( inputCheck < 1 )
        {
            printf( "Invalid Input!\n" );
            printf( "Try agian");
        } else if (inputCheck == 1)
            flag=1;
    }
    return size;
}

允許僅使用getchar和scanf進行用戶輸入。

使用fgets()會更好。 但是要忍受那種限制....


scanf(" %d ", &size ); 返回0,則非數字輸入保留在stdin

代碼需要使用無效的輸入-OP的代碼中缺少該輸入。

為了保持一致性,即使輸入良好,也要消耗其余的行。 在同一行上的良好輸入之后,此代碼不檢測尾隨垃圾是否存在。

" %d "的第二個空格也是一個問題。 " "指示scanf()讀取所有空白,直到檢測到某些非空白為止。 這意味着scanf(" %d ", &size ); 除非輸入"123\\n4\\n"類的信息,否則不會返回。 讀取4 ,確定不是空格 ,然后放回以供以后輸入。 從格式中刪除尾隨空格。

如果輸入返回EOF (文件結束或罕見的輸入錯誤),代碼也有問題。 函數sizeOfField()無法傳達文件結尾。 可以重新定義功能,或者暫時退出該程序。

int sizeOfField(void) {
  int inputCheck;

  do {
    int size;
    inputCheck = scanf("%d", &size);
    if (inputCheck == EOF) {
      break;
    }

    // consume rest of line
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);

    if (inputCheck == 1) {
      return size;
    }

    if (ch == EOF) {
      break;
    }

    // Non-numeric input occurred.
    printf("Invalid Input!\n" "Try again");
    fflush(stdout);
  }

  // No recovery possible
  exit(EXIT_FAILURE);  
}

奇怪的是,這是 " %d"勝過 "%d" 當輸入為非數字時,代碼確定至少所有前導 空格 (包括 '\\n' )都已消耗。 什么租船放回由於是非數字到規格 stdin ,如果不止一個字符必須是“放回”到是有問題的 stdin 沒有這樣的保證, while ((ch = getchar()) != '\\n' && ch != EOF); 可能不會消耗掉所有有害的非數字輸入。

暫無
暫無

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

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