#include <stdio.h>
int main()
{
int i;
long int l;
long long int ll;
char a;
float F;
double D;
scanf("%i%li%lli%c%f%lf",&i,&l,&ll,&a,&F,&D);
printf("%i\n%li\n%lli\n%c\n%f\n%lf\n",i,l,ll,a,F,D);
return 0;
}
当我尝试在上面的程序中打印a,F和D的值时,它打印'h'代表'char',打印0.000000和0.000000 for float和double。
input: 3
444
12345678912345
a
334.23
14049.30493
output:3
444
12345678912345
0.000000
-0.000000
答案 0 :(得分:6)
无法将char
或float
传递给printf
。在处理传递过程中,它们将分别升级为int
和double
。
当您传递double
时,您可以使用%f
或%lf
(后者是在C99中添加的,因此一些较旧的编译器不支持它。)
如果您希望将int
打印为字符,则可以使用%c
转换。如果您希望将其打印为数字,则可以使用%d
或%i
转化。
对于scanf
,您不希望传递上述任何内容 - 您希望将指针传递给(char | float | double)。
对于要使用的转化,对于指向char
的指针,您可以使用%c
或%s
。
%s
读取“单词” - 它会跳过空白字符,然后读取一组非空白字符。 %c
更像“原始”阅读 - 例如,如果您指定%15c
,它会读取接下来的15个字符,无论它们是否为空格。同时使用%c
和%s
,总是想要传递一个(如%15s
而非%s
)以确保用户无法输入太多数据并溢出您提供的缓冲区。 scanf("%s", whatever);
几乎等同于使用gets
。
使用scanf
,您可以通过%f
阅读float
和%lf
来阅读double
。
答案 1 :(得分:1)
答案 2 :(得分:0)
当您阅读输入时,您阅读的字符是12345678912345
和a
之间的空格。这意味着下一个格式(浮点)将尝试将字母a
读取为浮动指针值,这将无效,scanf
函数将返回而无法正确读取和解析所有输入,导致您的输出与输入不匹配。许多标准和系统函数返回一个值,表示它是成功还是失败,与scanf
函数相同,如果它没有完全失败,它将返回成功扫描和解析的项目的数量,这将在你的情况下比预期的要少。
我的一条评论中的scanf
引用会告诉您大多数格式会跳过前导空格,但"%c"
不会。如果要在尝试解析字符之前跳过前导空格,则需要通过在格式字符串中插入实际空格来告诉scanf
这样做:
scanf("%i%li%lli %c%f%lf",&i,&l,&ll,&a,&F,&D);
// ^
// Notice space here