上字母f或F。表示 long double型数,则必须在实数后加字母1或L 153字符型数据 1.字符常量 字符常量是用单引号()括起来的单个字符,如:A、a、0、$、'等。 C语言中,还有一种特殊的字符常量,即以“\”开头的字符序列,称 为转义字符。意思是将反斜杠“\”后面的字符转变成另外的意义,它通常 用来表示ASCI码字符集中一些特定的、具有控制功能的字符,如mn'。表 1-12中列出了C语言中常用的转义字符。 表1-12常用的转义字符 字符形式ASCI码 功能 响铃 10 制表符(横向跳格),光标跳到下一输出区(每个输出区占8列) uWbmMY 竖向跳格 格 可车但不换行,光标移到本行第一列 反斜杠字符“\” 34双引号 39单引号 用1~3位八进制数表示的任意字符,如0为A 用1~2位+六进制数表示的任意字符,如4为A 2.字符变量 字符变量是用来存放字符常量的。每个字符变量占一个字节的内存单 在一个字符变量中,只能存放一个字符常量。 字符变量的定义形式如下 char chI ch2 注意:①大多数编译系统中,将char型数据作为有符号类型( signed) 处理,即表示范围为-128~+127,如果要表示128~255范围内的字符,需 要定义为 unsigned类型,见表1-13。 表1-13字符类型 比特数 取值范围 Signed] char 128~+127 unsigned char 0~255
21 上字母 f 或 F。表示 long double 型数,则必须在实数后加字母 l 或 L。 1.5.3 字符型数据 1. 字符常量 字符常量是用单引号( ' )括起来的单个字符,如:'A'、'a'、'0'、'$'、','等。 C 语言中,还有一种特殊的字符常量,即以“\”开头的字符序列,称 为转义字符。意思是将反斜杠“\”后面的字符转变成另外的意义,它通常 用来表示 ASCII 码字符集中一些特定的、具有控制功能的字符,如'\n'。表 1-12 中列出了 C 语言中常用的转义字符。 表 1-12 常用的转义字符 字符形式 ASCII 码 功 能 \a 7 响铃 \n 10 换行 \t 9 制表符(横向跳格),光标跳到下一输出区(每个输出区占 8 列) \v 11 竖向跳格 \b 8 退格 \r 13 回车但不换行,光标移到本行第一列 \\ 92 反斜杠字符“\” \" 34 双引号 \' 39 单引号 \ddd 用 1~3 位八进制数表示的任意字符,如'\101'为'A' \xhh 用 1~2 位十六进制数表示的任意字符,如'\x41'为'A' 2. 字符变量 字符变量是用来存放字符常量的。每个字符变量占一个字节的内存单 元,在一个字符变量中,只能存放一个字符常量。 字符变量的定义形式如下: char ch1,ch2; 注意:① 大多数编译系统中,将 char 型数据作为有符号类型(signed) 处理,即表示范围为-128~+127,如果要表示 128~255 范围内的字符,需 要定义为 unsigned 类型,见表 1-13。 表 1-13 字符类型 类型 比特数 取值范围 [signed] char 8 -128~+127 unsigned char 8 0~255
②与0是截然不同的两个数。℃0是数字字符,其 ASCII码值为 48(0x30),而0则是整数值,可以表示ASCI为0的字符(即%0 3.字符串常量 字符串常量是由一对双引号("")括起来的字符序列。如:"Hllo、"Iove China!"、" How do you do?”等都是字符串常量。 C语言未对字符串的长度加以限制。为了判断字符串结束,C编译器会 自动在字符串的末尾加一个转义字符0,作为字符串常量的结束标志。因 此,字符串" China"在内存中占有6个字节的连续内存单元,如图14所示。 图14字符串在内存的存放 另外,C语言中无专门的字符串变量,而将字符串常量存放在字符型数 组中(将在第4章中介绍) 4.字符型数据与整型数据的相互运算 由于整型数据在内存中是以二进制补码形式存放的,字符型数据在内存 中以相应的ASCI码值存放,实际上也是以二进制形式存放的。因此,C 语言允许字符型数据与整型数据之间可以通用 【例1.7】字符数据用整数形式输【例.】字符数据与整数进行算术 出 算 #include <stdio. h> #include <stdio h> void main( Int x printI("%c,% n,ch) printf("%c, %d\n",ch, ch); 运行结果: printf("%c, %dn",x, x); A.65 运行结果 1.6数据的输入与输出 输入输出是对数据的一种重要操作。没有输出的程序是没有用的,没 有输入的程序是缺乏灵活性的。程序在多次运行时,用到的数据可能是不同
22 ② '0'与 0 是截然不同的两个数。'0'是数字字符,其 ASCII 码值为 48(0x30),而 0 则是整数值,可以表示 ASCII 为 0 的字符(即'\0')。 3. 字符串常量 字符串常量是由一对双引号(" ")括起来的字符序列。如:"Hello"、"I love China!"、"How do you do?"等都是字符串常量。 C 语言未对字符串的长度加以限制。为了判断字符串结束,C 编译器会 自动在字符串的末尾加一个转义字符'\0',作为字符串常量的结束标志。因 此,字符串"China"在内存中占有 6 个字节的连续内存单元,如图 1.4 所示。 C H i n a \0 图 1.4 字符串在内存的存放 另外,C 语言中无专门的字符串变量,而将字符串常量存放在字符型数 组中(将在第 4 章中介绍)。 4. 字符型数据与整型数据的相互运算 由于整型数据在内存中是以二进制补码形式存放的,字符型数据在内存 中以相应的 ASCII 码值存放,实际上也是以二进制形式存放的。因此,C 语言允许字符型数据与整型数据之间可以通用。 【例 1.7】 字符数据用整数形式输 出 #include <stdio.h> void main( ) { char ch; ch=65; printf("%c,%d\n", ch,ch); } 运行结果: A, 65 【例 1.8】 字符数据与整数进行算术 运算 #include <stdio.h> void main( ) { char ch; int x; ch='A'; x=ch+32; printf("%c,%d\n", ch, ch); printf("%c,%d\n", x, x); } 运行结果: A, 65 a, 97 1.6 数据的输入与输出 输入/输出是对数据的一种重要操作。没有输出的程序是没有用的,没 有输入的程序是缺乏灵活性的。程序在多次运行时,用到的数据可能是不同
的,因此,需要由用户临时输入程序运行所需要的数据。 C语言本身无输入输出语句,输入/输出均由函数来实现。C语言提供 了多种输入输出函数,标准I/O函数库中有一些公用信息都写在头文件 stdio. h中,因此,在使用输入输出函数时,一般应在程序开头先写预编译命 #include <stdio. h> pX #include"stdio. h" 本节介绍最常用的输入输出函数 scanf和 printf. 16. printf()函数 1.一般形式 printf函数的一般形式为: printf格式控制,输出表列, 其功能是:按照格式控制部分指定的格式,将输出表列的数据在标准输 出设备上输出 2.格式控制 格式控制”是用双引号括起来的字符序列,包括格式说明和普通字符 两部分,格式说明由“%”和格式字符组成,如%d、%f等。pinf函数的格 式字符及含义见表1-14 表1-14 printf格式字符 格式字符 %od(或%|输出带符号的十进制整数 %x(或%X)输出无符号十六进制整数(不输出前导符0x) 输出无符号八进制整数(不输出前导符0) 输出无符号十进制整数 输出十进制实数(隐含输出6位小数 9e或%E)以指数形式输出实数隐含输出6位小数) 自动选用%f或%e格式中输出宽度较短的一种格式输出实数,不输出 %g(或%G) 意义的0 输出单个字符 输出字符串 输出% 除了格式控制字符之外的字符均是普通字符,普通字符原样输出。下面 举例说明格式字符的用法 inta=123,b=-1 float x=12. 34
23 的,因此,需要由用户临时输入程序运行所需要的数据。 C 语言本身无输入输出语句,输入/输出均由函数来实现。C 语言提供 了多种输入输出函数,标准 I/O 函数库中有一些公用信息都写在头文件 stdio.h 中,因此,在使用输入输出函数时,一般应在程序开头先写预编译命 令: #include <stdio.h> 或 #include "stdio.h" 本节介绍最常用的输入输出函数 scanf 和 printf。 1.6.1 printf()函数 1. 一般形式 printf 函数的一般形式为: printf("格式控制", 输出表列); 其功能是:按照格式控制部分指定的格式,将输出表列的数据在标准输 出设备上输出。 2. 格式控制 “格式控制”是用双引号括起来的字符序列,包括格式说明和普通字符 两部分,格式说明由“%”和格式字符组成,如%d、%f 等。printf 函数的格 式字符及含义见表 1-14。 表 1-14 printf 格式字符 格式字符 含 义 %d(或%i) 输出带符号的十进制整数 %x(或%X) 输出无符号十六进制整数(不输出前导符 0x) %o 输出无符号八进制整数(不输出前导符 0) %u 输出无符号十进制整数 %f 输出十进制实数(隐含输出 6 位小数) %e(或%E) 以指数形式输出实数(隐含输出 6 位小数) %g(或%G) 自动选用%f 或%e 格式中输出宽度较短的一种格式输出实数,不输出无 意义的 0 %c 输出单个字符 %s 输出字符串 %% 输出% 除了格式控制字符之外的字符均是普通字符,普通字符原样输出。下面 举例说明格式字符的用法: int a=123,b=-1; float x=12.34;
char ch=65 printf("a=%d, b=%d", a,b) 输出结果:a=123.b=-1 printf("a=%x, b=%x", a, b); 输出结果:a=7B.b=fff printf("a=%0, b=%0", a,b) 输出结果:a=173.b=177777 printf("a=%u, b=%u", a, b) 输出结果:a=123.b=65535 printf("x=%f", x) 输出结果:x=12.34000 printf("x=%e" x) 输出结果:x=1.234000e+001 printf("x=%g", x) 输出结果:x=12.34 printf("%f%%", 1.0/3) 输出结果:0.33333 printf("ch=%c", ch) 输出结果:ch=A printf("str=%s"," I live China!");输出结果:str= I love China! 注意格式字符与其对应的输出项的类型要保持一致,例如,不应用%f 输出整数。 另外,格式控制字符中,在“%”和其后的格式字符之间,还可以插入 附加的格式说明符。见表1-15所示。 表1-15 printf的附加格式说明符 附加格式说明符 字母h|用于输出短整型数据,可加在格式符d、o、x、u前面 字母1 用于输出长整型数据或 double型数据,可加在格式符d、o、x、u f、e(或E)、g(或G)前面 m代表一个正整数J输出数据的最小宽度,如果数据的实际宽度超过m,则按实际宽 输出:如果小于m,则补空格 n(代表一个正整数对于实数,表示输出n位小数:对于字符串,表示截取的字符个数 (负号) 输出的数据或字符在域内向左对齐 下面给出了域宽与精度描述符的一些例子 int a123: float x=12. 345 printf("a=%5d", a) 输出结果:a=_123(表示空格) printf("a=%2d", a 输出结果:a=123 printf("a=%-5X", a) 输出结果:a=7B printf("x=%7. 2fx) 输出结果:x=12.35 printf("x=%.2f" x) 输出结果:x=12.35 printf("x=%102e", x) 输出结果:x=1.23e+001
24 char ch=65; printf("a=%d,b=%d",a,b); 输出结果:a=123,b=-1 printf("a=%X,b=%x",a,b); 输出结果:a=7B,b=ffff printf("a=%o,b=%o",a,b); 输出结果:a=173,b=177777 printf("a=%u,b=%u",a,b); 输出结果:a=123,b=65535 printf("x=%f",x); 输出结果:x=12.340000 printf("x=%e",x); 输出结果:x=1.234000e+001 printf("x=%g",x); 输出结果:x=12.34 printf("%f%%",1.0/3); 输出结果:0.333333% printf("ch=%c",ch); 输出结果:ch=A printf("str=%s","I live China!"); 输出结果:str=I love China! 注意格式字符与其对应的输出项的类型要保持一致,例如,不应用%f 输出整数。 另外,格式控制字符中,在“%”和其后的格式字符之间,还可以插入 附加的格式说明符。见表 1-15 所示。 表 1-15 printf 的附加格式说明符 附加格式说明符 含 义 字母 h 用于输出短整型数据,可加在格式符 d、o、x、u 前面 字母 l 用于输出长整型数据或 double 型数据,可加在格式符 d、o、x、u、 f、e(或 E)、g(或 G)前面 m(代表一个正整数) 输出数据的最小宽度,如果数据的实际宽度超过 m,则按实际宽度 输出;如果小于 m,则补空格 .n(代表一个正整数) 对于实数,表示输出 n 位小数;对于字符串,表示截取的字符个数 -(负号) 输出的数据或字符在域内向左对齐 下面给出了域宽与精度描述符的一些例子。 int a=123; float x=12.345; printf("a=%5d ",a); 输出结果:a=_ _123(_表示空格) printf("a=%2d",a); 输出结果:a=123 printf("a=%-5X",a); 输出结果:a=7B_ _ _ printf("x=%7.2f",x); 输出结果:x=_ _12.35 printf("x=%.2f",x); 输出结果:x=12.35 printf("x=%10.2e",x); 输出结果:x=_1.23e+001
printf("x=‰2E",x); 输出结果:x=1.234500E+001 printi("str=%53s" Computer"),输出结果:str=_Com printi("str=%3s";" Computer");输出结果:str= Computer 16.2 scanf()函数 1.一般形式 canf函数的一般形式为 scm"格式控制,地址表列, 其功能是:按照格式控制部分的要求,把从终端输入的数据传送到地址 表列指定的内存单元中 anf函数的“格式控制”与 printf函数的“格式控制”相似。“地址表 列”是由地址组成的,表示每个输入数据应存储的内存单元地址,它可以是 变量的地址,也可以是字符串的首地址。在变量名前加符号“&”表示该变 量的地址,如“&a”。 【例19】格式化输入与输出。 #include <stdio. h int a, b, c scanf("%d%d%d", &a, &b, &c) printf("a=%d, b=%d, c=%d\n", a, b, c); 执行 scanf函数时,如果格式控制部分只包含格式控制字符,不含其它 字符,则在输入数据时,数据之间可用一个或多个空格隔开,也可用回车键 或跳格键(Tab)隔开。因此,执行上面的程序时,下面的输入均正确: ①34 ②34 ③3(按Iab键4__5 输出结果均为:a=3,b=4c=5 非法的输入:3,4,5 2.格式说明 canf函数的“格式控制”与 print函数的“格式控制”类似,以“%” 开始,后面跟一个格式字符,中间也可插入附加格式说明符。表1-16列出 了 scanf函数中可以使用的格式字符,表1-17列出了 scanf函数可以使用的 附加格式说明符
25 printf("x=%2E",x); 输出结果:x=1.234500E+001 printf("str=%5.3s","Computer"); 输出结果:str=_ _Com printf("str=%3s","Computer"); 输出结果:str=Computer 1.6.2 scanf()函数 1. 一般形式 scanf 函数的一般形式为: scanf("格式控制", 地址表列); 其功能是:按照格式控制部分的要求,把从终端输入的数据传送到地址 表列指定的内存单元中。 scanf 函数的“格式控制”与 printf 函数的“格式控制”相似。“地址表 列”是由地址组成的,表示每个输入数据应存储的内存单元地址,它可以是 变量的地址,也可以是字符串的首地址。在变量名前加符号“&”表示该变 量的地址,如“&a”。 【例 1.9】 格式化输入与输出。 #include <stdio.h> void main( ) { int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d\n",a,b,c); } 执行 scanf 函数时,如果格式控制部分只包含格式控制字符,不含其它 字符,则在输入数据时,数据之间可用一个或多个空格隔开,也可用回车键 或跳格键(Tab)隔开。因此,执行上面的程序时,下面的输入均正确: ① 3_ _4_ _ _ _5↙ ② 3↙ 4_ _ _5↙ ③ 3(按 Tab 键)4_ _5↙ 输出结果均为:a=3,b=4,c=5 非法的输入:3, 4, 5↙ 2. 格式说明 scanf 函数的“格式控制”与 printf 函数的“格式控制”类似,以“%” 开始,后面跟一个格式字符,中间也可插入附加格式说明符。表 1-16 列出 了 scanf 函数中可以使用的格式字符,表 1-17 列出了 scanf 函数可以使用的 附加格式说明符