重复输入直到答案正确

时间:2016-07-16 08:49:16

标签: c loops conditional-statements

这个概念非常简单。计算机必须重复该问题,直到它收到有效的响应。这是我目前的代码:

#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: 

这是无限期的。

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

3 个答案:

答案 0 :(得分:1)

  
      
  • 计算机必须重复该问题,直至收到有效的回复。
  •   
  • (输出)无限期地这样。
  •   

原因:

  • 问题是您只在代码中收到一次输入,然后进入循环以检查age
  • 因为在每次迭代后都没有重新分配年龄值,如果第一次输入为!=32767则总是错误且进入无限循环或者也称为< strong>奇数循环。

    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

  • @davmac comment开始,您永远无法检查输入值是否大于int变量的最大值。< / p>

  • 相反,如果你以这种方式指定一个范围会更好

     `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

答案 1 :(得分:0)

一些要点:

首先,使用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;
 }

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

答案 2 :(得分:-1)

使用循环时执行。像:

Do{

// your code
Age = // asign value

}while(age>100 && age < 1);

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

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