簡體   English   中英

在循環中讀取C中的整數后跳過scanf

[英]scanf skipped after reading in integer in C, in while loop

我有一段代碼,我檢查scanf的輸入是否有效。 即如果scanf返回非零正數。 這是我的代碼的一部分:

while(scanf(" %d",&choice)<=0){
        printf("Incorrect value entered, please re-enter\n");
    }

其中“選擇”是整數。

每次運行此代碼時,編譯器都會在執行while循環后跳過scanf。 我得到這樣的輸出:


歡迎來到捕食者/獵物計算器

請輸入你的名字

丹嗨丹

請選擇以下選項之一:1。計算典型捕食者和獵物系統的演變2.計算特定捕食者和獵物系統的演變3.計算CUSTOM捕食者和獵物系統的演變0.退出不正確的值輸入,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入-enter輸入的值不正確,請重新輸入輸入的錯誤值,請重新輸入

輸入的值不正確,請重新輸入

你能解釋一下為什么會這樣嗎 我似乎無法在互聯網上找到任何特定於整數閱讀的答案。

非常感謝,

你的代碼的問題是,如果用戶沒有輸入數字,你的程序將永遠循環。 這是因為scanf會反復嘗試解析相同的字符串並繼續失敗。 你要做的就是匹配用戶寫的任何內容,然后再次詢問一個數字:

#include<stdio.h>

int main(){
    int choice;
    while(scanf("%d",&choice) <= 0){
        scanf("%*s"); // this will parse anything the user has written
        printf("Incorrect value entered, please re-enter\n");
    }
    return 0;
}

scanf格式字符串中的*是分配抑制字符,來自scanf手冊頁:

'*'賦值 - 抑制字符:scanf()按轉換規范的指示讀取輸入,但丟棄輸入。 不需要相應的指針參數,並且此規范不包含在scanf()返回的成功分配計數中。

編輯首先抱怨scanf()返回成功轉換的字段數。 接下來的問題是scanf會在輸入中留下未轉換的字符,並會嘗試再次轉換這些相同的字符。 在duff輸入后,您可以清除輸入,如下所示:

#include <stdio.h>

#define MAXCHOICE 42

int main(void)
{
    int choice, ch;
    while(scanf("%d",&choice) != 1 || choice < 1 || choice > MAXCHOICE){
        printf("Incorrect value entered, please re-enter\n");
        while((ch = getchar(stdin)) != '\n');     // clear the input
    }
    printf("Choice %d\n", choice);
    return 0;
}

計划會議:

100
Incorrect value entered, please re-enter
a
Incorrect value entered, please re-enter
5
Choice 5

可能這就是你需要的:

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

int main(void){
    int choice,repeat = 0;

    do{
        printf("Give a Number: ");
        if((scanf("%d",&choice)) != 1){
            printf("ErrorFix it!\n");
            exit(1);
        }else{
            if(choice > 0){
                printf("OK\n");
                repeat = 0;
            }else{
                printf("Incorrect value entered, please re-enter\n");
                repeat = 1;
            }
        }
    }while(repeat == 1);

    printf("Your typed %d\n",choice);
    return 0;
}

輸出:

Give a Number: 0
Incorrect value entered, please re-enter

Give a Number: -5
Incorrect value entered, please re-enter

Give a Number: 10
OK
Your typed 10

暫無
暫無

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

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