C语言的输入和输出


C语言的输入和输出:

1、输出:

(1)、printf

点击查看代码
printf("控制格式",参数列表);
功能:向终端上显示要打印的信息

参数:
    控制格式:%d   %c  %s
    参数列表:(变量1,变量2.......)

    unsigned int a;
    printf("%c\n",a); 打印字符类型
    printf("%d\n",a); 打印整形
    printf("%u\n",a); 打印无符号整形
    printf("%ld\n",a);打印长整形
    printf("%lld\n",a);打印长长整形
    printf("%#o\n",a);打印八进制( #代表显示八进制的前缀 )
    printf("%#x\n",a);打印十六进制 (#代表显示十六进制的前缀 )
    printf("%f\n",a); 打印浮点类型,显示小数点后6位
    printf("%.2f\n",a);打印浮点类型,显示小数点后2位
    printf("%g\n",a);  打印浮点类型,显示小数点后有效位
    printf("%e\n",a);  打印浮点类型,会以指数的形式显示(例如:2e-2)
    printf("%Lf\n",a); 打印long double类型浮点数据
    printf("%p\n",&a); 打印一个变量的地址
    printf("%s\n",a); 打印的是字符串
    
    printf("%04d\n",a); 占用四个位置,没数据的位补充0
    printf("%4d\n",a); 占用四个位置,没数据的位补充空格
    printf("%-4d\n",a); 占用四个位置,- 代表左对齐 (不写 - 默认是右对齐)
    printf("%d\t%d\n",a,a); 这里的\t是一个制表符 ( \t===>Tab)
    printf("%%\n"); 打印一个%
    
        printf中的转译字符:
        printf("abc\067\n");  ==>\067 => '7'
        printf("abc\67\n");  ==>\67 => '7'
        printf("adc\x65\n")  ==>\x65 => 'e'
        printf("hello \"wo\"rld\n");=>\" 代表打印 "
        printf("hello \'wo\'rld\n"); =>\' 代表打印 '  

        '\n' =>回车
        '\t' =>Tab
        '\a' =>发出一个“咚”
        '\b' =>退格
        '\r' =>回滚行首
??这里特别注意 '\b'的用法: \b的含义是,将光标从当前位置向前(左)移动一个字符(遇到\n或\r则停止移动),

??并从此位置开始输出 '\b' 后面的字符(空字符\0和换行符\n除外);

?'\b'用法案例:

点击查看代码
//案例1:
#include 
int main(void)
{
    printf("1234567\b\b\b\b89");

    return 0;
}
//输出结果:
//1238967
//在输出1234567之后,因为紧接着要输出4个\b,这时程序把光标前(左)移了4个字符的位置,然后输出了89这两个字符,占用了45这两个字符的位置。
 
//案例2:
#include 
int main(void)
{
    printf("我喜欢用C语言写\b\b\b程序");

    return 0;
}
//输出结果:
//我喜欢用C程序写
//可见: 无论是汉字还是英文字母,\b的行为是一样的;

//案例3:
#include 
int main(void)
{
    printf("12345\n67\b\b\b\b89");

    return 0;
}
//输出结果:
//12345
//89
//可见,\b遇到换行符\n,光标就不会再向前(左)移动了。

2、输入:

(1)、scanf

点击查看代码
 scanf("控制格式",地址列表);
    功能:从终端读取控制格式的内容
    参数:
        控制格式:%c   %d   %u  %s
        地址列表:&a,&b
    返回值:
        成功读取到的项目的个数
        失败返回EOF(-1)

scanf("%d",&a);          //输入一个整数
scanf("%d%c",&b,&a);     //同时输入两个字符  10c  回车
scanf("%d,%c",&b,&a);  //同时输入两个字符  10,c  回车
scanf("%d  %c",&b,&a);   //同时输入两个字符  10  c  回车

scanf("%d",&b);          //先输入一个整数,回车
scanf("%*c%c",&a);       //%*c它会吃掉输入的第一个字符

scanf("\n%d",&b);
scanf("\t%d",&b);        //输入的时候会跳过回车,tab,空格
scanf("  %d",&b);

scanf("%d\n",&b);                                                                       
scanf("%d\t",&b);        //输入整数后,回车,tab,空格,都没反应在随便输入一个字符,就可以结束程序了
scanf("%d ",&b);              
                    
char a[10];              //这是一个char类型有10成员的数组,a是数组名
scanf("%[^\n]",a);       //%[^\n]:除了'\n'之外的所有字符全输入
printf("a = %s\n",a);
(2)、getchar()

???案例:

点击查看代码
#include 
int main(int argc, const char *argv[])
{
    int a, b;
    scanf("%d%d", &a, &b);
    printf("a=%d, b=%d \n", a, b);
    char c, d;
    scanf("%c%c", &c,&d);
    printf("c=%c, d=%c \n", c, d);
    
    return 0;
}
//执行结果:
//12  23
//a=12, b=23
//x  y
//c=
//,d=x
??可以看到:上面案例中的程序的结果是不正确的,因为我们在第一次输入的数据结尾是有一个换行符,所以第二次打印的数据的第一个字符的值就是换行符。

??我们可以使用下面的方法进行,把此换行符消除:

点击查看代码
#include 
int main(int argc, const char *argv[])
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("a=%d,b=%d\n",a,b);
    getchar();                //用于消除掉上一次输入数据的结尾的换行符
    char c,d;
    scanf("%c%c",&c,&d);
    printf("c=%c,d=%c\n",c,d);
    return 0;
}
//运行结果:
//linux@ubuntu:~/c$ gcc test.c
//linux@ubuntu:~/c$ ./a.out
//13 14
//a=13,b=14
//a b
//c=a,d=b