我有一个代码。想法是当我需要输入一个数字但我输入一个非数字字符,检查错误并要求我输入一个工作号码,或继续或中断。但它跳过代码没有输入数字。这是代码:
int EnterNumber(){
int number;
printf("Enter your's number:");
if(!scanf("%d", &number)){
puts("Keypress don't number!");
int choose = 0;
puts("Work:\n\t1. Continue 2. Break \nYour's number will choose:");
while(!scanf("%d", &choose)){ // here it jumped.I cann't enter number!
switch(choose){
case 1:
EnterNumber();
break;
case 2:
break;
default:
puts("Keyboard don't recognize");
break;
}
}
}
return number;
}
有人可以帮我解决错误吗?
答案 0 :(得分:0)
您似乎在帖子中实现了递归。但是代码中的某些行不是必需的,并且会妨碍递归算法的潜在效率。
递归算法的基本要素可以在2个语句中捕获:
1)每个递归调用应该在相同的较小实例上 问题, 也就是说,一个较小的子问题 2)递归调用必须最终到达基本情况,这是解决的 没有进一步的递归 ( from here )
以下是对原始EnterNumber()
函数的修改,简化为仅包含上面列出的递归算法的基本要素。
- 读取并测试输入字符(较小的实例...)
当测试失败时,- 离开标准(基本情况......)
可以根据需要进行扩展,以便在原始帖子中包含您想要的其他功能(例如更多用户输入,或者通知用户输入不是数字)
void EnterNumber(char a);
int main(void)
{
char c;
int num;
printf("Enter your number:");
scanf(" %c", &c);
// ^ notice space preceeding format char,
// comsumes newline from previous read and allows next input
num = isdigit(c);
EnterNumber(c);
printf("\nHit any key to exit\n");
getchar();
return 0;
}
/// Simple demo of recursion:
/// caches input as long as it is a number
/// outputs cache and exits if alpha char
void EnterNumber(char a)
{
if(isdigit(a) != 0)
{
printf("Enter your number:");
scanf(" %c", &a);
// ^ notice space preceeding format char,
// comsumes newline from previous read and allows next input
EnterNumber(a);
}
printf("%c\n", a);
}
关于 scanf() 函数的格式字符串中的空格:
空格字符:该函数将读取并忽略任何空格 在下一个非空白字符之前遇到的字符 (空格字符包括空格,换行符和制表符 - 见isspace)。格式字符串中的单个空格验证任何内容 从流中提取的空白字符数量(包括 没有)。 ( from here )