《C语言教程》04章 附带格式的输入输出


printf()函数和scanf()函数中的f是format的缩写,这里面用到的“格式”,在C语言其它地方也有很广的应用。

一、格式输出『printf()』

前面已经说过,一个字符用%d格式就可以输出其ASCII码即字符的整数值。用%c格式则输出这个字符。如果用%f格式,则小数的方式输出。

#include <stdio.h>

int main(void)
{
    int days = 360;

    //“劝学网”三字的ASCII码是“C8B0”“D1A7”“CDF8”
    printf("\xC8\xB0\xD1\xA7\xCD\xF8\t小雅\n");   //显示:劝学网{TAB}小雅

    printf("北京奥运还有: %d天\n", days);
    printf("\a\a");          //“嘟嘟”

    //以下三行写在同一行
    printf("%s", "这是C语言");
    printf("教程\t");
    printf("作者:%s\n","小雅");

    //360分别以整数、小数、科学计数法显示
    printf("整数:%d\n小数:%f\n科学:%e\n",days,(float)days,(double)days);

    //以下控制字节长度
    printf("360用5个字节表示:[%5d]\n",days);   //[...]中共5字节
    printf("3.6保留2位整数2位小数:[%5.2f]\n",(float)days/100);   //[...]中2位整数2位小数,
                                                                  //外加小数点共5字节
    return 0;
}  

注意:格式符的个数必须和逗号后面的变量或常量相同,类型也必须一致或可以直接转换。

二、常见格式符号
格式字符 类 型 输出格式
c int 或
win_t
以字符方式输出。
C int 或
win_t
用在printf()函数中时,以双字节字符显示;用在wprintf()函数中时,以单字节字符显示。
d int 以整型输出。
i int 以整型输出。
o int 以八进制无符号整型输出。
u int 以无符号整型输出
x int 以十六进制小写输出(abcdef)。
X int 以十六进制小写输出(ABCDEF)。
e double 以科学计数法表示float和double型数据。(其中e用小写)
E double 以科学计数法表示float和double型数据。(其中E用大写)
f double 以小数表示float和double型数据。
g double 自动地将能显示的很小或很大的数转换成%f,不能直接显示的数则转换成%e。
G double 自动地将能显示的很小或很大的数转换成%f,不能直接显示的数则转换成%E。
n Pointer to integer Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument.
p Pointer to void 内存地址,以十六进制表示。
s String 以字符串输出。
S String 用在printf()函数中时,以双字节字符串显示;用在wprintf()函数中时,以单字节字符串显示。

三、格式输入『scanf()』

scanf()函数的功能与printf()函数正好相反,是输入数据的功能。但对于初学者却有一难点,即所输入的数据存放到变量时,用到了地址操作。地址操作也就是指针,是C语言的难点、重点,许多人不会C语言的根本原因就是没学会指针。

既然指针这么难,为什么C语言要使用指针呢?C语言产生之前,前辈们都是用机器语言或汇编语言来编程,整天都是与内存地址打交道,C语言使用了指针,使得程序运行速度接近汇编语言,编程效率、实现的功能大大提高。当今电脑硬件的飞速发展,使速度不成问题,于是Java、C#都基本废除了指针的使用。


#include <stdio.h>

int main(void)
{
    int age;         //年龄
    char name[20];    //姓名

    printf("请输入你的年龄:");
    scanf("%d", &age);      //&age表示变量age的地址

    printf("请输入你的姓名:");
    scanf("%s", name);      //name单独使用就表示变量name的地址

    printf("\n姓名=%s\t年龄=%d\n",name,age);

    return 0;
}  

上例中,2个变量当作参数使用时,一个用了&符号,一个没用,为什么呢?原来当一个变量的类型是基本类型、或扩充基本类型时,变量的地址要用&符号再加变量名。其它尤其指数组,单独使用变量名,就表示该变量的地址。关于这一点,以后讲完数组和指针后还要详细讨论。