【问题标题】:Some trouble with scanf() functionscanf() 函数的一些问题
【发布时间】:2021-11-12 19:27:47
【问题描述】:

这对你来说可能看起来很简单,但我真的不明白出了什么问题。 为什么我为b 输入的值分配给h? 也就是说,我不能再输入步骤。程序立即输出一行。有什么问题?

int main(int argc, char** argv) {
    double a, b, h, x, x1, E;
    printf(" Input eps:");
    scanf("%lf", &E);
    printf(" Input [a,b]:");
    scanf("%lf,%lf", &a, &b);
    printf(" Step :");
    scanf("%lf", &h);
    printf ("%lf,%lf,%lf,%lf", E, a, b, h);
    return 0;
}

【问题讨论】:

  • OT:为了便于阅读和理解:请使用有意义的变量名。像:a, b, h, x, x1, E 这样的名称毫无意义,即使在当前上下文中也是如此

标签: c scanf


【解决方案1】:
scanf("%lf,%lf",&a,&b);

格式字符串中的逗号表示您需要输入一个逗号。否则扫描在一项后失败,将5留在输入流中。

如果您检查scanf 的返回值,您会看到它是一而不是二。这就是为什么b 为零(尽管它可以是任意值,因为您没有对其进行初始化)并且输入流中剩余的5 被用于以下 scanf 填充h.

最简单的解决方法可能只是使用 "%lf %lf" 代替,使用空格而不是逗号。空白不被视为对确切字符的字面要求,它只会跳到第一个非空白字符。来自scanf 指令的 ISO C11 标准:

格式由零个或多个指令组成:一个或多个空白字符、普通多字节字符(既不是 % 也不是空白字符)或转换规范。

由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。

一个普通的多字节字符指令通过读取流的下一个字符来执行。如果这些字符中的任何一个与构成指令的字符不同,则该指令将失败,并且不同的字符和后续字符仍然未读。

作为转换规范的指令定义了一组匹配的输入序列,如下面的每个说明符所述。

逗号既不是空格也不是转换规范(以% 开头),属于上述“普通多字节字符”段落的范围。


顺便说一句,这可以通过以下程序进行说明:

#include <stdio.h>

int main()  {
    double d1 = 999, d2 = 998;
    printf("Enter two doubles: ");
    int count = scanf("%lf,%lf", &d1, &d2);
    printf("count = %d, d1 = %f, d2 = %f\n", count, d1, d2);

    printf("Rest of input line is: [");
    int ch;
    while ((ch = getchar()) != '\n') {
        putchar(ch);
    }
    puts("]");

    return 0;
}

这会在我的系统上产生以下内容:

pax:/home/pax> ./testprog # with space separator
Enter two doubles: 4.6 9.2
count = 1, d1 = 4.600000, d2 = 998.000000
Rest of input line is: [ 9.2]

pax:/home/pax> ./testprog # with comma separator
Enter two doubles: 4.6,9.2
count = 2, d1 = 4.600000, d2 = 9.200000
Rest of input line is: []

【讨论】:

    【解决方案2】:

    在您的代码的scanf("%lf,%lf",&amp;a,&amp;b); 行中的第一个%lf 和第二个之间不需要逗号,。它应该改用"%lf%lf""%lf %lf"

    在它们之间使用逗号的问题是它跳过了b的用户输入,直接接受h的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多