对于刚接触C语言的同学来说 可能会遇到这个问题 

因为博主也是个菜鸟经常因为搞不清楚单精度双精度还有输入输出格式的问题

就这个问题也百度的很多次 所以在这里总结一下分享给大家

printf输出格式

1.转换说明符 
      %a(%A)     浮点数、十六进制数字和p-(P-)记数法(C99)       %c             字符
      %d             有符号十进制整数
      %f              浮点数(包括float和doulbe)       %e(%E)     浮点数指数输出[e-(E-)记数法]       %g(%G)     浮点数不显无意义的零"0"
      %i              有符号十进制整数(与%d相同)       %u             无符号十进制整数
      %o             八进制整数    e.g.     0123
      %x(%X)      十六进制整数0f(0F)   e.g.   0x1234       %p             指针       %s             字符串       %%            "%"
2.标志
      左对齐:"-"   e.g.   "%-20s"       右对齐:"+" e.g.   "%+20s"
      空格:若符号为正,则显示空格,负则显示"-"   e.g.   "% 6.2f"             #:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;
           对e,g,f 类当结果有小数时才给出小数点。
3.格式字符串(格式)
      [标志][输出最少宽度][.精度][长度]类型       "%-md" :左对齐,若m比实际少时,按实际输出。
     "%m.ns":输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n 
      e.g.    "%7.2s"   输入CHINA     

                               输出"CH"      "%m.nf":输出浮点数,m为宽度,n为小数点右边位                      

      e.g.    "%3.1f"   输入3852.99 
                              输出3853.0        长度:为h短×××量,l为长×××量
printf的格式控制的完整格式: % - 0 m.n l或h 格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。


scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

scanf函数的一般形式

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:
scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

格式字符串格式字符串的一般形式为:
    %[*][输入数据宽度][长度]类型
    其中有方括号[]的项为任选项。各项的意义如下。

1) 类型
表示输入数据的类型,其格式符和意义如下表所示。

格式  字符意义

d    输入十进制整数

o    输入八进制整数

x    输入十六进制整数

u    输入无符号十进制整数

f输入实型数(用小数形式或指数形式)

c    输入单个字符

s    输入字符串


2) “*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:


scanf("%d %*d %d",&a,&b);
scanf("%d %*d %d",&a,&b);

当输入为:1   2   3时,把1赋予a,2被跳过,3赋予b。

3) 宽度
用十进制整数指定输入的宽度(即字符数)。例如:


scanf("%5d",&a);
scanf("%5d",&a);


输入12345678只把12345赋予变量a,其余部分被截去。

又如:

scanf("%4d%4d",&a,&b);
scanf("%4d%4d",&a,&b);


输入12345678将把1234赋予a,而把5678赋予b。
4) 长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。

使用scanf函数还必须注意以下几点:
scanf函数中没有精度控制,

如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。

scanf中要求给出变量地址,如给出变量名则会出错。

如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。

在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:

scanf("%c%c%c",&a,&b,&c);
scanf("%c%c%c",&a,&b,&c);

输入 d、e、f 则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为 def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。

如果在格式控制中加入空格作为间隔,如:

scanf("%c %c %c",&a,&b,&c);
scanf ("%c %c %c",&a,&b,&c);

则输入时各数据之间可加空格。

例;


#include<stdio.h>
intmain(void){
chara,b;
printf("input character a,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
return0;
}
#include <stdio.h>
int main(void)
{
    char a,b;
    printf("input character a,b\n");
    scanf("%c%c",&a,&b);
    printf("%c%c\n",a,b);
    return 0;
}

由于scanf函数"%c%c"中没有空格,输入M  N,结果输出只有M。而输入改为MN时则可输出MN两字符。



#include<stdio.h>
intmain(void){
chara,b;
printf("input character a,b\n");
scanf("%c %c",&a,&b);
printf("\n%c%c\n",a,b);
return0;
}
#include <stdio.h>
int main(void)
{
    char a,b;
    printf("input character a,b\n");
    scanf("%c %c",&a,&b);
    printf("\n%c%c\n",a,b);
    return 0;
}

本例表示scanf格式控制串"%c %c"之间有空格时,输入的数据之间可以有空格间隔。

5) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:


scanf("%d,%d,%d",&a,&b,&c);
scanf("%d,%d,%d",&a,&b,&c);

其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:

scanf("a=%d,b=%d,c=%d",&a,&b,&c);
scanf("a=%d,b=%d,c=%d",&a,&b,&c);

则输入应为:a=5,b=6,c=7。

6) 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。




#include<stdio.h>
intmain(void){
inta;
printf("input a number\n");
scanf("%d",&a);
printf("%ld",a);
return0;
}
#include <stdio.h>
int main(void)
{
    int a;
    printf("input a number\n");
    scanf("%d",&a);
    printf("%ld",a);
    return 0;
}

由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。如改动程序如下



#include<stdio.h>
intmain(void){
longa;
printf("input a long integer\n");
scanf("%ld",&a);
printf("%ld",a);
return0;
}
#include <stdio.h>
int main(void)
{
    long a;
    printf("input a long integer\n");
    scanf("%ld",&a);
    printf("%ld",a);
    return 0;
}

运行结果为:
input a long integer
1234567890
1234567890

当输入数据改为长整型后,输入输出数据相等。

#include<stdio.h>
intmain(void){
chara,b,c;
printf("input character a,b,c\n");
scanf("%c %c %c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
return0;
}
#include <stdio.h>
int main(void)
{
    char a,b,c;
    printf("input character a,b,c\n");
    scanf("%c %c %c",&a,&b,&c);
    printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
    return 0;
}

输入三个小写字母,输出其ASCII码和对应的大写字母。



#include<stdio.h>
intmain(void){
inta;
longb;
floatf;
doubled;
charc;
printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
return0;
}
#include <stdio.h>
int main(void)
{
    int a;
    long b;
    float f;
    double d;
    char c;
    printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
    return 0;
}

输出各种数据类型的字节长度。