【问题标题】:Jump code in C when error enter number错误输入数字时在C中跳转代码
【发布时间】:2017-08-25 13:54:15
【问题描述】:

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

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

谁能帮我解决这个错误,好吗?

【问题讨论】:

  • 这不是“跳转”,而是递归,你可能不希望在这里。您已经有一个while 循环,只需修复它。
  • 你能准确地说出我的错误吗!
  • 好的,谢谢。我解决了问题!
  • 请注意,scanf() 在 EOF 上返回 -1,您的代码会将其视为有效输入。
  • 好的,谢谢!我会注意这么多。

标签: c


【解决方案1】:

您似乎在帖子中实现了递归。但是代码中的某些行是不需要的,并且会阻碍递归算法的潜在效率。

递归算法的本质可以用 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)

【讨论】:

  • OP 不需要递归。 OP 只是对如何再次提示用户感到困惑
  • @pm100 - 我不确定。至少在使用scanf() 时清除空白空间的 cmets 可能会有所帮助。谢谢。
  • 是的,这是他的错误——除了使用递归的巨大设计错误
  • 谢谢大家!我的英语不好,但我会研究你的想法。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2021-01-14
  • 2011-12-05
相关资源
最近更新 更多