【问题标题】:Break in if-Statement中断 if 语句
【发布时间】:2021-08-18 11:52:17
【问题描述】:

我写了以下代码:

int main(void){
    double (*func[]) (double) = {func1, func2, func3};
    int option = 0;
    double sum;
    double result;
    do{
        scanf("%d", &option);
        if(option == 3){
            break;
        }
        scanf("%lf", &sum);
        printf("%.2lf\n", result = (*func[option])(sum));
    } while (option<10);
    return 0;

但是当我输入 3 时,它期望另一个值并退出。 输入3后怎么破? 还有一个更好的 do-while-loop 表达式而不是 option

编辑:应该使用 scanf (不是我的选择) 有人问了一个例子(输入,输出):

选择一个选项:3 (什么都没有发生,直到我输入另一个值) 4 (这里退出)

【问题讨论】:

  • 请edit 显示输入和预期输出的示例。
  • scanf 很难正确,我强烈建议使用fgets 将完整的行读取到临时缓冲区,然后从那里解析(例如,使用sscanf、strtol 等.).
  • 只有边界检查option才有意义。而且由于您出于某种原因正在使用带符号的数字,因此您必须在调用函数指针之前执行if(option &gt;=0 &amp;&amp; option &lt;3)。
  • 您检查过option 的实际值吗?使用调试器或简单的打印输出。
  • @TedLyngmo 说了什么。在 main 的开头引入一个随机序列的打印输出。如果你没看到,那就是泰德说的。

标签: c if-statement do-while break


【解决方案1】:

您必须 始终检查scanf返回的值。我会用一个while循环而不是do/while来写这个。 (实际上,我会完全重构它并完全避免 scanf,但这是一个不同的问题)。

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

int
main(void)
{
        int option = 0;
        double sum;
        while( 1 == scanf("%d", &option) && option != 3 ){
                if( 1 != scanf("%lf", &sum) ){
                        fprintf(stderr, "Invalid input\n");
                        return EXIT_FAILURE;
                }
                printf("option = %d, sum = %lf\n", option, sum);
        }
        return EXIT_SUCCESS;
}

如果输入了无效选项,该代码不会给出错误消息,但由于这显然是为了交互使用,打印错误消息并终止可能不是所需的行为。也许你想做这样的事情:

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

void
eat_line(void)
{
        int c;
        while( (c = getchar()) != EOF && c != '\n' ) {
                ;
        }
        if( c == EOF ){
                fprintf(stderr, "EOF\n");
                exit(EXIT_FAILURE);
        }
}

int
main(void)
{
        int opt;
        double sum;
        while( 1 ){
                while( printf("enter an option: ") && 1 != scanf("%d", &opt) ){
                        fprintf(stderr, "Invalid input\n");
                        eat_line();
                }
                if( opt == 3 ){
                        break;
                }
                while( printf("enter a value: ") && 1 != scanf("%lf", &sum) ){
                        fprintf(stderr, "Invalid input\n");
                        eat_line();
                }
                printf("option = %d, sum = %lf\n", opt, sum);
        }
        return opt == 3 ? EXIT_SUCCESS : EXIT_FAILURE;
}
  

但是恕我直言,试图使用用户友好的 scanf 制作程序是没有意义的。

【讨论】:

  • 好吧,为了用户友好,您通常需要系统特定的功能。如果您以交互方式运行,您通常希望在输入格式错误后丢弃一行的其余部分,因为 stdin 是行缓冲的;您实际如何解析输入在很大程度上与此无关,而 scanf 对于解析很方便。
  • @Peter-ReinstateMonica 说得好。我这里的代码会发出重复的错误消息。哎呀。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多