本文目錄一覽:
C語言編程問題,求高手解答遇到輸入非法字符時,怎麼處理。
#includestdio.h
#includetime.h
#include stdlib.h
#include “regex.h”
const int MAX_LEN = 1000;
/*去掉字符串兩端的空格*/
char * trimString(char guessString[])
{
int head = 0 ,rear = strlen(guessString)-1;
char result[MAX_LEN];
int i,k;
/*開頭空格*/
while( guessString[head] != ‘\0’
(guessString[head] == ‘ ‘ || guessString[head] == ‘ ‘ )
)
{
head ++;
}
/*尾部空格*/
while( rear = 0
(guessString[rear] == ‘ ‘ || guessString[rear] == ‘ ‘ )
)
{
rear –;
}
for(i = head ,k = 0; i = rear ; i++ , k++)
{
result[k] = guessString[i];
}
result[k] = ‘\0’;
return result;
}
/*
提取字符串中的【正整數】。
如果是恰好包含【一個正整數】的字符串(正數前後可以有任意個空格,正數可以有多餘的前導0),則返回這個正數;
如果是一個空串,則返回 -1
如果包含非數字字符,則返回-2
*/
int transStringToNum(char guessString[])
{
int i;
int head = 0 ,rear = strlen(guessString)-1;
char trimGuessString[MAX_LEN];
int num = 0;
// 去前後空格
strcpy(trimGuessString,trimString(guessString));
// 檢查是否空串
if( 0== strlen(trimGuessString) )
{
return -1;
}
// 檢查是否有非數字字符
for(i = 0 ; trimGuessString[i] != ‘\0’ ; i ++)
{
if(trimGuessString[i] ‘0’ || trimGuessString[i] ‘9’)
{
return -2;
}
}
// 字符串轉換成數字
for(i = 0 ,num = 0 ; trimGuessString[i] != ‘\0’ ; i++)
{
num = num * 10 + (trimGuessString[i] – ‘0’);
}
return num;
}
int main()
{
int num,guessNum,n,count=0;
char guessString[MAX_LEN];
char reply;
srand(time(NULL));
do
{
//產生一個隨即數
num=rand()%100+1;
printf(“你有10次機會,請猜數字並按回車。\n”);
for(n=1;n=10;n++)
{
// 以字符串形式讀入一個整數
gets(guessString);
/*
調用函數 transStringToNum 進行有效性驗證
當返回值 guessNum 是負數時,
字符串 guessString 中沒有合法的正數
*/
guessNum = transStringToNum(guessString);
if(guessNum == -1 )
{
printf(“請輸入一個數字(必須是在1-100 之間)!\n”);
n–;
continue;
}
if(guessNum == -2 )
{
printf(“輸入的不是一個合法數字(必須是在1-100 之間)!\n”);
n–;
continue;
}
if(guessNumnum)
{
printf(“It’s too high!\n”);
}
else if(guessNumnum)
{
printf(“It’s too low!\n”);
}
/*
這裡有誤,是 == 而不是 =
因為你剛好把這個分支放在最後,因此察覺不到錯誤
如果你寫成
if(guessNum = num) else if(guessNumnum) else if(guessNumnum)
就知道錯了。這時if(guessNum = num)永遠都會被執行
因為這是一個【賦值語句】而不是【邏輯語句】,且 num 的值是恆正的
*/
else if(guessNum == num)
{
printf(“You are right!\n”);
printf(“你共用了%d次機會猜對數字。\n”,n);
break;
}
}
printf(“Do you want to continue(Y/N or y/n)?”);
/*
用 getch() 取代scanf ,不易出錯
因為 getch()只能輸入一個字符
而 scanf 可以讀入多個字符,而且要回車
*/
fflush(stdin);
reply = getch();
}while((toupper(reply)==’Y’));
printf(“The game is over!\n”);
return 0;
}
/*
輸入合法數字示例(數字包含在一對””中):
“123”
” 123″
“123 “
” 123 “
” 0000123 ”
上面的結果都是輸入正數: 123
*/
關於C語言scanf遇到非法數據的問題?
輸入444時的回車遺留在輸入緩衝區里(因為scanf在%d控制下不接收回車符),被下面的scanf(“%c”,y);當作一個字符接收了(回車符也是字符啊),所以while還要循環,直接要求你輸入數據,但輸入的是字母不是數字,scanf(“%d”,…)不接收並留在輸入緩衝區里,被下面的scanf(“%c”,y);接收,while的()中不是0,所以printf就輸出了上次接收的444。如此往複。
把scanf(“%c”,y);改成scanf(” %c”,y);,即在%前加一個空格,把輸入444時遺留在輸入緩衝區里的’\n’吸收掉,就能等你輸入數據了。但由於y是char型,無論輸入什麼都不會是0,所以while循環不會停止。
正確改法是在scanf(“%c”,y);前加一句fflush(stdin);把輸入錯了數據從輸入緩衝區中統統清除,並把while(y);改成while(y!=’N’);,則當輸入N時程序就結束了。
c語言 非法輸入
這個數據驗證非常簡單,請看代碼:
/* 放到程序全局部分 */
#define PLUSH while (getchar() != ‘\n’)
/* 變量聲明 */
int input_result;
/* 數據輸入以及驗證 */
do {
input_result = scanf(“%d”,num);
if ((input_result != 1) || (num 11)) {
PLUSH;
printf(“您輸入的數據有誤,請重新輸入:”);
}
} while ((input_result != 1) || (num 11));
請用/* 數據輸入以及驗證 */的這段代碼替代您程序中的以下部分:
while(1)
{
printf(“請輸入您的選擇:\n”);
scanf(“%d”,num);
if(num=0num=11)
{
break;
}
else
printf(“您的選擇錯誤,請重新輸入:\n”);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159062.html