在 c 我有這個片段
int n=0;
do {
printf("random text\n");
scanf("%d", &n);
} while ( n < 1 || n > 10);
當用戶輸入除數字以外的任何內容時,回圈會在printf不等待用戶輸入的情況下發送垃圾郵件
為什么會發生這種情況,我該如何解決
uj5u.com熱心網友回復:
當用戶輸入錯誤資料時,未轉換的資料仍保留在輸入緩沖區中。
然后,您反復嘗試將該資料轉換為整數,每次都失敗,導致無限重復。
如果失敗,您可以將輸入緩沖區清除到下一個換行符。
就個人而言,我通常更喜歡從一行開始閱讀,然后嘗試按照sscanf以下一般順序將其轉換為 :
char buffer[256];
do {
fgets(buffer, sizeof(buffer), stdin);
} while (sscanf(buffer, "%d", &n) == 0 || n < 1 || n > 10);
一般來說,最好將呼叫fgets和sscanfup 包裝在一個函式中,這樣當任何一個失敗時,您都可以回傳一些錯誤指示(因為這不會檢查回傳值,fgets它可以/將繼續嘗試讀取,即使從流失敗)。
uj5u.com熱心網友回復:
如果緩沖區不包含有效數字,則需要跳過緩沖區的當前內容。例如
int n=0;
do {
printf("random text\n");
if ( scanf("%d", &n) == 0 )
{
scanf( "%*[^\n]" );
}
} while ( n < 1 || n > 10);
注意這個提示
printf("random text\n");
當您期望用戶輸入數字時,會感到困惑。
通常,您還應該添加對 EOF 的檢查。例如
int result = 1;
int n=0;
do {
n = 0;
printf("random text\n");
result = scanf("%d", &n);
if ( result == 0 )
{
scanf( "%*[^\n]" );
}
else if ( result == EOF )
{
break;
}
} while ( n < 1 || n > 10);
if ( result == EOF ) exit( 1 );
//...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486397.html
上一篇:makefile中-Tlinker.ld與linker.ld之間的區別
下一篇:值未存盤在字符陣列的索引0中
