【问题标题】:Continue running the program as long as inputs are valid只要输入有效,就继续运行程序
【发布时间】:2020-02-13 04:31:12
【问题描述】:

所以我刚开始学习编程,并且正在开发一个简单的程序,只要它是一个有效的浮点数,它就会扫描和存储用户输入值。如果输入无效,则程序立即退出并返回 1。最后,如果所有输入都有效,程序将输出存储的值。我在想一个像

这样的结构
while (scanf("%f",input)==1){
    //code that store the value of input;
    value=input
}
else{
    printf("invalid");
    return 1
}
printf("%f",value);

但问题是不存在 While-else 结构,我真的很难解决这个问题。我可以对输入进行任何其他调节以生成所需的结果吗?

顺便说一句,我认为简单地删除 else 并不能真正起作用——因为要输出值,我必须使用 Ctrl d 手动退出 while 循环。然后因为我退出了while循环,无论如何我都会打印无效。是否存在只打印值的结构?谢谢。

【问题讨论】:

  • 去掉'else'就行了。
  • 嗯,但问题是如果我删除 else,“无效”将被打印出来,我不希望这种情况发生。如果每个输入都是浮点数,有没有办法避免打印“无效”?
  • 干得好检查输入函数的返回。如果您只想在所有值都有效的情况下输出所有值,那么您需要将循环结构更改为连续循环,并在循环内保存来自scanf 的返回并检查1(良好的输入,存储值在数组中),0(错误输入,退出)或EOF(所有输入都很好,break 连续循环),然后遍历数组输出所有值。

标签: c loops while-loop


【解决方案1】:

while 循环将继续运行直到达到退出条件,这意味着不需要else,因为它下面的代码不会被执行。

一个简单的解决方法就是删除else,因为它不是必需的:)

【讨论】:

  • 哦,所以所有输入都有效,那么 printf 将不会被执行?这是有道理的,谢谢
【解决方案2】:

while 谓词必须为假才能继续,因此假设的while-elsewhile 相同。想在sscanf 的(至少)三个结果之间做出决定:

  • 完成处理一个浮点数;
  • 错误处理,(这可能是底层流错误或语法错误);
  • 文件结尾,(stdin.)

来自sscanf documentation,可以使用此设置,

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    float input, value;
    int nread;
    while((nread = scanf(" %f", &input)) == 1) {
        ////code that store the value of input;
        value=input;
    }
    if(ferror(stdin)) {
        // nread != 1 && ferror: error reading input.
        perror("stdin"); // POSIX.1-2017 guarantees this will be set, not C99.
        return EXIT_FAILURE;
    } else if(nread != EOF) {
        // nread != 1 && nread != EOF && !ferror: matching error.
        fprintf(stderr, "Syntax error.\n");
        return EXIT_FAILURE;
    }
    // nread == EOF && !ferror: normal, input ends before the first conversion has
    // completed, and without a matching failure.
    return EXIT_SUCCESS;
}

sscanf 的返回值包含更多信息,而不仅仅是一个二元决策,所以一般来说,人们想要保存它。

【讨论】:

    【解决方案3】:

    我猜你的代码在一个函数中,当输入错误时你想从那里返回,所以在这种情况下这将起作用

    while(1) {
        //code that store the value of input;
        if (scanf("%f",input)==1){
          value=input
        }
        else{
          return 1;
        }
    }
    
    
    

    【讨论】:

    • 嗯,但这不会总是导致返回 1 吗?因为在我输入一个输入并且 while 循环扫描它之后,while 1 循环将继续运行,并且因为它不再扫描任何输入,它将返回 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多