你要麼需要使用fgets()
閱讀整行,然後用sscanf()
掃描線,或者你需要處理時,要求掃描一些scanf()
不是願意看過去的信。
#include <stdio.h>
enum { MIN_VALUE = 0, MAX_VALUE = 23 };
int main(void)
{
int h;
char line[4096];
while (fgets(line, sizeof(line), stdin) != 0)
{
if (sscanf(line, "%d", &h) == 1 && h >= MIN_VALUE && h <= MAX_VALUE)
{
printf("You entered: %d\n", h);
break;
}
printf("What you entered was not a number between %d and %d\n",
MIN_VALUE, MAX_VALUE);
}
return 0;
}
如果你想在可接受值是1..23,改變MIN_VALUE爲1
注意,使用fgets()
這段代碼的一個好處是,你可以報什麼電腦讀回用戶 - 代碼不這樣做,但它可以很容易。當你每行讀取多個值時,這是最有價值的。如果scanf()
讀取預期的6個項目中的4個,則只有輸入行的一部分要報告給用戶。另一方面,如果sscanf()
讀取預期的6個項目中的4個,則可以報告用戶輸入的整行,這通常對用戶更有意義。
還是這個,也許,但它退出的第一個非整數的數據,這是不是真的在規格:
#include <stdio.h>
int main(void)
{
int h;
while (scanf("%d", &h) == 1)
{
if (h >= 0 && h <= 23)
{
printf("You entered: %d\n", h);
break;
}
printf("What you entered was not a number between 1 and 23\n");
}
return 0;
}
或者,也許你需要狼吞虎嚥輸入行的其餘部分,當scanf()
失敗:
#include <stdio.h>
int main(void)
{
int c, h;
while (1)
{
switch (scanf("%d", &h))
{
case EOF:
return 1;
case 0:
printf("What you entered was not a number between 1 and 23\n");
while ((c = getchar()) != EOF && c != '\n') /* Gobble rest of line */
;
break;
default: /* or case 1: */
if (h >= 0 && h <= 23)
{
printf("You entered: %d\n", h);
return 0;
}
break;
}
}
/*NOTREACHED*/
return 0;
}
關於第二個想法,請使用fgets()
版本;它更乾淨。
目前還不清楚你在問什麼。 – Shoe
我需要檢查輸入是否像'foo'或任何類型的字符串值比再次說value.I我的意思是我需要在此程序中轉義字符串值。我只需要整數值1至23. –
您要讀取輸入,直到'h'的範圍是[[1,23]'? – user2176127