C语言编程问题,求高手解答遇到输入非法字符时,怎么处理。

猜数游戏编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次水溶液04-0322:53:59才猜对此数,以此来反映猜数者“猜”的水平,... 猜数游戏
编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次水溶液 04-03 22:53:59才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜对的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复才多个数,指导操作者想停止才结束。
【思考题】如果用scanf 输入用户猜测的数据时,如果用户不小心输入了非法字符,如字符a,那么程序运行就会出错,用什么方法可以避免这样的错误发生呢?请读者编写程序验证方法的有效性。

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

int main()
{
int num,guess,n,count=0;
char reply;
srand(time(NULL));
do
{
num=rand()%100+1; //产生一个随即数

printf("你有10次机会,请猜数字并按回车。\n");
for(n=1;n<=10;n++)
{
scanf("%d",&guess);
if(guess>num)
{ printf("It's too high!\n");

}
else if(guess<num)
{
printf("It's too low!\n");

}
else if(guess=num)
{
printf("You are right!\n");
printf("你共用了%d次机会猜对数字。\n",n);

break; //跳出循环体

}
} //最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。

printf("Do you want to continue(Y/N or y/n)?");
scanf(" %c",&reply);
}while((toupper(reply)=='Y'));
printf("The game is over!\n");
return 0;
}
展开
 我来答
百度网友b0e28cae4
2011-04-08 · TA获得超过4016个赞
知道大有可为答主
回答量:1275
采纳率:85%
帮助的人:596万
展开全部
#include<stdio.h>
#include<time.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(guessNum>num)
{
printf("It's too high!\n");
}
else if(guessNum<num)
{
printf("It's too low!\n");
}
/*
这里有误,是 == 而不是 =
因为你刚好把这个分支放在最后,因此察觉不到错误
如果你写成
if(guessNum = num) else if(guessNum>num) else if(guessNum<num)
就知道错了。这时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
*/
军神再现
2011-04-08 · TA获得超过569个赞
知道答主
回答量:98
采纳率:0%
帮助的人:64.5万
展开全部
可以采用如下语句
while((scanf("%d",&x))==1)
{}
只有输入一个数字时,才进入主体语句
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式