【问题标题】:Repeating an Input till it is answered Correct重复输入直到它被回答正确
【发布时间】:2016-11-19 10:45:58
【问题描述】:

这个概念很简单。计算机必须重复这个问题,直到它收到一个有效的回答。这是我当前的代码:

#include <stdio.h>


int main(int argc, const char * argv[]) {
int age;

do{
printf("How old are you?\n");
scanf("%d", &age);


if (age == 32767)

{
    printf("Error, retry: \n");
}

else
{
    printf("Cool.");
    break;

}
}
while(age!=3267);

return (0);
}

if else 语句用于在用户键入非整数的情况下捕获异常。

我尝试使用 do-while 循环,但它最终变成了一个无限循环 我使用了 do-while 循环,因为我需要执行该过程,直到获得有效的年龄值。

我使用当前代码的输出是:

How old are you?
g
Error, retry: 
How old are you?
Error, retry: 
How old are you?
Error, retry: 
How old are you?
Error, retry: 

它会无限期地这样下去。

如果你能帮助我,那就太好了。

【问题讨论】:

  • 使用do while循环。
  • " 尝试使用 do-while 循环但失败了..." - 为什么?如何?你做了什么?这不是编码服务。见How to Ask
  • 谢谢奥拉夫,我已经纠正了我的问题。
  • 对于交互式提示阅读
  • 了解如何正确格式化源代码!这几乎无法阅读。

标签: c loops conditional-statements


【解决方案1】:
  • 计算机必须重复该问题,直到收到有效的回答。
  • (输出) 无限期地这样下去。

原因:

  • 问题在于您在代码中只接收一次输入,然后进入循环检查age
  • 由于每次迭代后不会重新分配年龄值,因此如果第一个输入是!=32767,则始终是错误的并且进入无限循环或也称为奇循环。

    scanf("%d", &age); //scans only once
    
    do //enters loop
    {
        if (age == 32767)
        {
            printf("Error, retry: \n");
        }
    
        else
        {
            printf("Cool.");
        }
    } while(age!=32767);
    

if else 语句用于在用户键入非整数的情况下捕获异常。

  • if (age == 32767) 只会检查输入的响应是否等于32767

  • @davmaccomment 中,您永远无法检查大于 int 变量最大值的输入值。

  • 如果您以这种方式分配范围会更好

     `if (age > 100 || age <0 )`
    

解决方案:

为避免每次迭代都对age 进行此扫描,并查看我所做的更改:

do{

    printf("How old are you?\n");

    if(scanf("%d", &age)==1) //checking if scanf is successful or not
    {

        if (age > 100 || age <0 )
        {
            printf("Error, retry: \n");
        }

        else
        {
            printf("Cool.");
            break; //break loop when correct value is entered
        }
    }

    else //if scanf is unsuccessful 
    {
        char c;
        printf("enter only integers\n");

        do
        {
            scanf("%c",&c);
        }while( c !='\n' && c!= EOF ); //consuming characters
    }

}while(1); //always true

【讨论】:

  • age &gt; max_value_of_int 怎么可能是真的?另外,为什么不使用INT_MAX 而不是尝试猜测最大值?最后,如果scanf 失败(因为输入不是数字)- 并且age 处于未初始化状态怎么办?然后比较它会调用未定义的行为。
  • @davmac 是的,是的!忘记了 int 溢出 :(,我一会儿再编辑
  • 这是一个很好的答案,但最终的解决方案是无限循环
  • 天哪!这真太了不起了!谢谢!!你能向我解释一下第二个 else 语句是如何工作的吗? E0F 是什么意思?
  • @Kuldeep1007tanwar “让一个简单的事情越来越正确有什么意义?” FTFY。
【解决方案2】:

一些要点:

首先,使用scanf 从用户输入中读取int 通常允许先输入空格:

scanf(" %d", &age);

特别是,这会跳过先前输入且仍在缓冲中的先前换行符。

其次,scanf 返回一个值,指示它是成功还是失败,以及它匹配的项目数。 你需要检查这个返回值

 int r = scanf(" %d", &age);
 if (r == EOF) {
     break;
 }
 if (r == 0) {
     printf("Error, retry: \n");         
 }

第三,如果scanf 不能匹配输入,它就会留在输入缓冲区中。如果您不从缓冲区中检索它,那么下次您调用scanf 时,它将无法再次匹配,无限期。出于这个原因,scanf 根本不适合处理用户输入。如果可能,最好将单行输入读入缓冲区(如果您小心的话,可以使用fgets),然后处理缓冲区。作为一个较弱的替代方案,您可以在尝试再次读取输入值之前通过扫描字符串来强制消耗一些输入缓冲区:

 int r = scanf(" %d", &age);
 if (r == EOF) {
     break;
 }
 if (r == 0) {
     printf("Error, retry: \n");
     scanf("%*s"); // match string but suppress assignment
 }
 else {
     printf("Cool.\n");
     break;
 }

此修改使您的代码至少处于一半工作状态。

【讨论】:

    【解决方案3】:

    使用 do while 循环。喜欢:

    Do{
    
    // your code
    Age = // asign value
    
    }while(age>100 && age < 1);
    

    所以它会重复,直到年龄输入在 100 和 1 之间。如果它的年龄为 1 - 100,它将停止。

    谢谢。希望它会有所帮助。

    【讨论】:

    • 我认为你正在尝试做 - while(age= 1);
    • @Kuldeep1007tanwar:我不这么认为。但是代码还是错误的。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多