您的位置:

c语言输入非法数据会怎样,c语言怎么处理非法输入

本文目录一览:

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");

}