这是个很多新手都不清楚的细节!
一定记住,scanf遇到第一个不符合的字符,就会把它放回输入流去!下次还会读到这个字符!
那么下次scanf再读的时候还会遇到它!还会给judge返回0,放回去!死循环!
1. 简单的解决方法是在printf后面,循环里写 if(judge==0)getchar();来拿掉那个不符合要求的字符。
2. 法一的问题是,如果你还可能同时输入多个非数字字符,这样会输出好几遍"Please input a number of one of your cards.\n",解决方法是写个循环:
char c;if(judge==0)while((c=getchar())!='\n');
或者用getline,拿一行丢掉,是一样的。
3. 或者直接改scanf,涉及scanf高级特性:
while(1)
{
judge = scanf("%d", &card);
if(judge==0)judge=scanf("%*[^0-9]%d",&card);//加一行
if(judge == 1 && card > 1 && card < 11)
break;
printf("Please input a number of one of your cards.\n");
}
这样可以获得,如果你输入“abc3”,能把这个3输入进去。如果是“abc15”,15超范围了,一样会让你重新输入。
看你的需求了。
关于这些,我刚写了个文章:网页链接讲的更细致,可以看看。
当然这个也有EOF的情况,读到输入末尾,windows里就是按Ctrl-Z+enter,有时候要按两次Ctrl-Z+enter,模拟文件读到尽头的情况,那还要继续判断!if(judge==EOF) break;不过这个可能也超出考虑范围了。
scanf里有非常多这种很危险的小细节!最好看看!或者干脆只用getline拿进来,用sscanf读东西!
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个数字:");
int a = int.Parse(Console.ReadLine());
for (; ; )
{
if (a % 2 == 0)
a = a / 2;
else
a = a * 3 + 1;
if(a==1)
break;
}
Console.WriteLine(a);
Console.ReadKey();
}
}