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: []