char,double和float的正确说明符是什么?

时间:2016-02-27 16:41:08

标签: c

#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

3 个答案:

答案 0 :(得分:6)

的printf

无法将charfloat传递给printf。在处理传递过程中,它们将分别升级为intdouble

当您传递double时,您可以使用%f%lf(后者是在C99中添加的,因此一些较旧的编译器不支持它。)

如果您希望将int打印为字符,则可以使用%c转换。如果您希望将其打印为数字,则可以使用%d%i转化。

scanf的

对于scanf,您不希望传递上述任何内容 - 您希望将指针传递给(char | float | double)。

对于要使用的转化,对于指向char的指针,您可以使用%c%s

  1. %s读取“单词” - 它会跳过空白字符,然后读取一组非空白字符。
  2. %c更像“原始”阅读 - 例如,如果您指定%15c,它会读取接下来的15个字符,无论它们是否为空格。
  3. 同时使用%c%s总是想要传递一个(如%15s而非%s)以确保用户无法输入太多数据并溢出您提供的缓冲区。 scanf("%s", whatever);几乎等同于使用gets

    使用scanf,您可以通过%f阅读float%lf来阅读double

答案 1 :(得分:1)

%c用于char

注意 - 您应该检查scanf的返回。

Demo

答案 2 :(得分:0)

当您阅读输入时,您阅读的字符是12345678912345a之间的空格。这意味着下一个格式(浮点)将尝试将字母a读取为浮动指针值,这将无效,scanf函数将返回而无法正确读取和解析所有输入,导致您的输出与输入不匹配。许多标准和系统函数返回一个值,表示它是成功还是失败,与scanf函数相同,如果它没有完全失败,它将返回成功扫描和解析的项目的数量,这将在你的情况下比预期的要少。

我的一条评论中的scanf引用会告诉您大多数格式会跳过前导空格,但"%c"不会。如果要在尝试解析字符之前跳过前导空格,则需要通过在格式字符串中插入实际空格来告诉scanf这样做:

scanf("%i%li%lli %c%f%lf",&i,&l,&ll,&a,&F,&D);
//              ^
// Notice space here