2017-08-25 76 views
0

我有一个代码。想法是当我需要输入一个号码,但我输入一个非数字字符,检查错误,并要求我输入一个工作号码,或继续或中断。但它跳过代码不输入数字。这是代码:错误输入号码时在C跳转代码

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; 
} 

任何人都可以帮助我解决这个错误吗?

+2

这是不是一个“跳”,它是*递归*,你可能不希望在这里。你已经有了'while'循环,只需修复它。 –

+0

你能说我完全错误! –

+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

+0

OP不需要递归。 OP对于如何再次提示用户感到困惑 – pm100

+0

@ pm100 - 我不确定。至少也许在使用'scanf()'时清除空白空间的意见会有所帮助。谢谢。 – ryyker

+0

是的,这是他的错误 - 除了使用递归 – pm100