第二章 基本数据类型及数据的输入输出
2.0预备知识
2.1常量与变量
2.2数据类型
2.3常用输出与输入函数练习与实践
§ 2.0 预备知识
计算机中数的表示及进制转换
数码、基与权
数码:表示数的符号
基:数码的个数
权:每一位所具有的值
数制
c
程序设计第二章基本数据类型及数据输入输出
C
数制基权表示数码特点
…,102,10110o
十进制数
0~9
10
逢十进一二进制数
0~1
2
…,22,21,2o
逢二进一八进制数
0~7
8
…,82,81,8o
逢八进一十六进制数
0~9,A~F,a~f
16
…,162,161,16o
逢十六进一十进制,4956= 4?103+9?102 +5?101+6?10o二进制,1011 1?23+0?22 +1?21+?2o十六进制,8 AE=8?163+?162 +10?1 1+14?16o八进制,275 2 8 7 8 5 8o
语言程序设计第二章数据描述
C
各种进制之间的转换
二进制、八进制、十六进制转换成十进制
方法:按权相加
100123452 59212120212121111011 )()(例
100128 94868381136 )()(例
10012316 7 9 7 81610162161516121 )()(例AF
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
各种进制之间的转换 (整数 )
二进制、八进制、十六进制转换成十进制
方法:按权相加
十进制转换成二进制、八进制、十六进制
原理:
的余数是
2
)2.,,,,,22(2
22.,,,,,22
).,,,,,(
0
0
0
1
2
1
1
0
0
1
1
1
1
2011
N
a
aaaa
aaaa
aaaaN
n
n
n
n
n
n
n
n
nn
方法:连续除以基,从低到高记录余数,直至商为 0
例 把十进制数 59转换成二进制数
592
292
142
72
32
12
0
(59)10=(111011)2
1
1
0
1
1
1
1 1 1 0 1 1
余余余余余余例 把十进制数 159转换成八进制数
1598
198
28
0
(159)10=(237)8
2 3 7
余 7
余 3
余 2
例 把十进制数 459转换成十六进制数
45916
2816
116
0
(459)10=(1CB)16
1 C B
余 11
余 12
余 1
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
二进制与八进制之间的转换
二进制转换成八进制:从右向左,每 3位一组(不足 3位左补 0),转换成八进制
八进制转换成二进制:用 3位二进制数代替每一位八进制数例 (1101001)2=(001,101,001)2=(151)8
例 (246)8=(010,100,110)2=(10100110)2
000 ~ 0
001 ~ 1
010 ~ 2
011 ~ 3
100 ~ 4
101 ~ 5
110 ~ 6
111 ~ 7
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
二进制与十六进制之间的转换
二进制转换成十六进制:从右向左,每 4位一组
(不足 4位左补 0),转换成十六进制
十六进制转换成二进制:用 4位二进制数代替每一位十六进制数例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16
例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2
0000 ~ 0
0001 ~ 1
0010 ~ 2
0011 ~ 3
0100 ~ 4
0101 ~ 5
0110 ~ 6
0111 ~ 7
1000 ~ 8
1001 ~ 9
1010 ~ A
1011 ~ B
1100 ~ C
1101 ~ D
1110 ~ E
1111 ~ F
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
字节和位
内存以字节为单元组成
每个字节有一个地址
一个字节一般由 8个二进制位组成
每个二进位的值是 0或 1
01234567
0
1
2
3
4
5
6
7
8
9
10 ……..
.
语言程序设计第二章数据描述
C
7
6
4
3
2
5
1
c
程序设计第二章基本数据类型及数据输入输出
数值的表示方法 ——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为 1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为 1,其余位为原码取反,再对整个数加 1
3
12
6
9
1
2
4
57
8
10
11
9-5=4
9+7=16=(14)12
< >
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出为什么用补码表示?
25-19=25+(-19)
(25)10=(00011001)2 (-19) 10 =(11101101) 2
00011001
+ 11101101
-----------------
100000110
c
程序设计第二章基本数据类型及数据输入输出
C
为什么用补码表示?
19 - 25 = 19 +(- 25)
(19)10=(00010011)2 (-25) 10 =(11100111) 2
00010011
+ 11100111
-----------------
11111010 -------(-6)?
引入补码之后符号位也进入了运算,不用再单独处理符号位
c
程序设计第二章基本数据类型及数据输入输出
C
原码 反码 补码
+7 00000111 00000111 00000111
-7 10000111 11111000 11111001
+0 00000000 00000000 00000000
-0 10000000 11111111 00000000
数的范围
01111111~
11111111
(-127~+127)
01111111~
10000000
(-127~+127)
01111111~
10000000
(-128~+127)
(用一字节表示数)
负数补码转换成十进制数:最高位不动,其余位取反加 1
例 补码,11111001
取反,10000110
加 1,10000111=-7
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
§ 2.1 常量与变量
标识符
定义:用来标识变量、常量、函数等的字符序列
组成:
只能由 字母,数字,下划线 组成,且第一个字母必须是字母或下划线
大小写敏感
不能使用关键字
长度:最长 32个字符
命名原则:
见名知意
不宜混淆 如 l与 I,o与 0
例,判断下列标识符号合法性
sum Sum M.D.John day Date 3days
student_name #33 lotus_1_2_3
char a>b _above $123
M 3da
#33
$123a>b
语言程序设计第二章基本数据类型及数据输入输出
C
一般用大写字母
是宏定义预处理命令,不是 C语句
直接常量,
整型常量
实型常量
字符常量
字符串常量如 #define PRICE 30
常量
定义:程序运行时其值不能改变的量(即常数)
分类,
符号常量,用标识符代表常量
定义格式,#define 符号常量 常量例 符号常量举例
#define PRICE 30
main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}
运行结果,total=300
c
程序设计第二章基本数据类型及数据输入输出
C
编译程序根据变量定义为其分配指定字节的内存单元 …...
地址
int a=1,b=-3,c;
a
b
c
2字节
2字节
2字节地址地址
…...
内存
1
-3
随机数
变量 ------其值可以改变的量概念:
每个变量有一个名字:用标识符表示。
每个变量有一个存储空间(存储单元),该单元中的状态所表示的数为此时变量的值。
变量初始化,定义时可以赋初值合法标识符
变量的使用,先定义,后使用
变量定义的一般格式:
数据类型 变量 1[,变量 2,…,变量 n];
如,int a,b,c;
float x,y;
c
程序设计第二章基本数据类型及数据输入输出
C
例,
int a=2,b,c=4;
float data=3.67;
char ch=?A‘;
int x=1,y=1,z=1;
int x=y=z=1;
例 2
float a,b,c;
c=a%b; //Illegal use of floating point in function main
变量定义位置,一般 放在函数开头
main()
{ int a,b=2;
float data;
a=1;
data=(a+b)*1.2;
printf(―data=%f\n‖,data);
}
变量定义可执行语句
main()
{ int a,b=2;
a=1;
float data;
data=(a+b)*1.2;
printf(―data=%f\n‖,data);
}
语言程序设计第二章数据描述
C
例 1
int student;
stadent=19; //Undefined symbol?statent? in function main
每一个变量都有一个类型,表明了为它的存储属性,
分配空间的大小;
表示的数的范围;
所能进行的运算。
例 2.1
main()
{
float length,area,radius; /*length为周长,
area为面积,radius半径 */
printf("\nEnter a radius,");
scanf("%f",&radius);
length=2*PI*radius; /*计算圆的周长 */
area=PI*radius*radius; /*计算圆的面积 */
printf("\n length is,%f ",length);
printf("\n area is,%f ",area);
}
程序的运行情况为:
Enter a radius,2.8 ↙
length is,17.584000
area is,24.617599
§ 2.2 数据类型
数据类型总表
C
数据类型基本类型构造类型指针类型空类型 void
定义类型 typedef
字符类型 char
枚举类型 enum
整 型实型单精度型 float
双精度型 double
数组结构体 struct
共用体 union
短整型 short
长整型 long
整型 int
数据类型决定:
1,数据占内存字节数
2,数据取值范围
3,其上可进行的操作语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
2.2.1整数类型整数类型的标识符是 int。 整型数据根据其占用的内存字节数不同,可加限定词:
short(短整型 ),int,long(长整型 ),
short≤int≤long
可用 sizeof(类型标识符)测量
unsigned short (无符号短整型 ),
unsigned int (无符号整型 ),
unsigned long (无符号长整型 ),
其中 short和 long的引入是为满足实际要求的不同长度的整数,而经 unsigned限定词限定的整数总是正的 。
c
程序设计第二章基本数据类型及数据输入输出
C
01 11 11 11 11 11 11 11int型,最大,32767
10 00 00 00 00 00 00 00 最小,-32768
11 11 11 11 11 11 11 11unsigned int型,最大,65535
00 00 00 00 00 00 00 00 最小,0
语言程序设计第二章数据描述
C
整型常量(整常数)
三种形式:
十进制整数:由数字 0~9和正负号表示,如 123,-456,0
八进制整数:由数字 0开头,后跟数字 0~7表示,如 0123,011
十六进制整数:由 0x开头,后跟 0~9,a~f,A~F表示,
如 0x123,0Xff
例 12 与 12L例 30000 为 int型65536 为 long int 型问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
83
291
255
问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
c
程序设计第二章基本数据类型及数据输入输出
C
c
程序设计第二章基本数据类型及数据输入输出
C
整型常量的类型
根据其值所在范围确定其数据类型:
一个整数若值在 -32768~ 32767内,则默认为它是 int型;一个整数若值在 -2147483648~ 2147483647之间,可使用长整型常量表示。
在 整常量后加字母 l或 L,认为它是 long int 型常量
无符号数也可用后缀表示,整型常数的无符号数的后缀为? U”或
u”。
例如,358u,0x38Au,235Lu 均为无符号数; 0XA5Lu表示十六进制无符号长整数 A5,其十进制为 165。
一个非负的整数,只要它的值不超过相应变量的取值范围,就可以赋给 unsigned型变量。例如,可以将 6000赋给一个
unsigned int型变量,但却不可以将 66000赋给一个 unsigned int
型变量(将会出现溢出错误)
整型变量定义方法:
int a1,a2;
unsigned int b1,b2;
一个整型常量只可以赋给能容纳下其值的整型变量 。
如 a1,a2的取值范围为 -32768----32767
b1,b2的取值范围为 0----65535
如果,a1=65535;
或者,b1=-1;
在内存中数值将不是所赋的数值。
c
程序设计第二章基本数据类型及数据输入输出
C
2.2.2 实数类型实数类型分为单精度 ( float) 和双精度
( double) 类型,二者的区别在于所占存储位的多少,从而决定了其取值范围 。
通常以 32位 ( bits) 来存储单精度实数型数据,以 64位来存储双精度实型数据 。
c
程序设计第二章基本数据类型及数据输入输出
C
实型常量(实数或浮点数)
表示形式:
十进制数形式,由数字和小数点组成,小数点的左右至少一边要有数字。 (必须有小数点) 如 0.123,.123,123.0,
0.0,123.
指数形式,由尾数,e或 E和指数部分组成,E的两边都至少要有一位数且 E的右边只允许是整数形式 ( e或 E之前必须有数字;
指数必须为整数)如 12.3e3,123E2,1.23e4,e-5,
1.2E-3.5
实型常量的类型
默认 double型
在 实型常量后加字母 f或 F,认为它是 float 型语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
实型变量实型变量的说明形式如下,
float 变量名 1[,变量名 2,…… 变量名 n];
double 变量名 1[,变量名 2,…… 变量名 n];
float,占 4字节,提供 7位有效数字
double,占 8字节,提供 15~16位有效数字例 float a;
a=111111.111; /* a=111111.1*/
double b;
b=111111.111; /* b=111111.111*/
float a,b,c;
double x,y;
语言程序设计第二章基本数据类型及数据输入输出
C
【 例 2.2】 实型变量的有效数字 。
main( )
{ double a;
a=6.152367864359046178294901;
printf("\n%25.20f",a);
}
输出结果为:
6.15236786435904648000
在这个例子中,a被赋值了一个有效位数为 25位的数字 。 但由于 a是
double类型的,所以 a只能接收 15~16位有效数字 。 在 printf语句中,我们使用了 %20.18f这样的格式符号,这指示 printf语句在输出 a时总长度应为 25位,小数点位数占 20位 。 输出的结果显然显示了 25位数,但只有
6.152367864359046共 16位有效数字被正确显示出来,后面的数字是一些无效的数值 。 这就表明 double型的数据只接收 15~16位有效数字 。
语言程序设计第二章基本数据类型及数据输入输出
C
2.2.3 字符类型整 型,实 型都是数值型,是大家比较熟悉的 。
除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型 。
字符型数据包含的是一个字符集 。 一般用的是
ASCII码字符集见附录 A(p249) 。
字符集中的每一个字符都有一个序号,称为
ASCII码 。 ASCII码大的字符比 ASCII码小的字符值大 。
字符类型的标识符是 char。
语言程序设计第二章基本数据类型及数据输入输出
C
字符常量
定义,用 单引号 括起来的单个 普通字符 或 转义字符,
字符常量的 值,该字符的 ASCII码 值
<
转义字符及其含义:
转义字符 含义
\n
\v
\r
\a
\?
\ddd
\t
\b
\f
\\
\―
\xhh
转义字符 含义换行垂直制表回车响铃单引号
3位 8进制数代表的字符水平制表退格换页反斜线双引号
2位 16进制数代表的字符如 ‘ \101‘ -----------?A‘?\012‘ -----------‘\n‘
\376‘ -----------‘?‘?\x61‘ -----------‘a‘
\60‘ -----------‘0‘?\483‘ ----------(?)
例,
A‘-------‘\101‘-------‘\x41‘--------65
如 ‘ A‘——65,‘ a‘——97,
‘ 0‘——48,?\n‘——10
如 ‘ aA\n\101?
转义字符,反斜线后面跟一个字符或一个代码值表示例 转义字符举例 (ch2_001.c,ch2_004.c)
main()
{
printf("\101 \x42 C\n");
printf("I say:\"How are you?\"\n");
printf("\\C Program\\\n");
printf("Turbo \'C\'");
}
运行结果,(屏幕显示 )
A B C
Isay:”How are you?”
\C Program\
Turbo?C?
例 main()
{ printf(―Y\b=\n‖);
}
运行结果:
屏幕显示,=
打印机输出,¥
语言程序设计第二章基本数据类型及数据输入输出
C
字符型变量
char 变量名 1,[变量名 2,......变量名 n];
如,char c1,c2 ;
一个字符型变量的值只能是一个单个字符; 在内存中占一个字节 ;
字符变量存放的是字符的 ASCII码 ;
char与 int数据间可进行算术运算 ;
由于字符型变量在内存中是以字符的 ASCII码 —一个无符号整数的形式来存放的,所以在 一定范围 内,
字符型数据和整型数据是可以互相通用的,二者的区别仅在于:字符型常量占一个字节,而整型常量占两个字节。
例 a=?D‘; /* a=68; */
x=?A‘+5; /* x=65+5; */
s=?!‘+?G‘ /* s=33+71; */
语言程序设计第二章基本数据类型及数据输入输出
C
【 例 2.3】 将小写字母转化为大写字母 。
main( )
{char c1,c2;
c1='x';c2='y';
c1=c1?32;
c2=c2?32;
printf("\n%c,%c",x1,x2);
}
程序的输出结果是,X,Y
这个例子是将小写字母转化为大写字母的程序 。 我们在对
ASCII码字符表进行观察后会发现,大小写对应的字母,它们之间的 ASCII码正好相差 32。 利用这个特性和上一个特性,
我们可以编写出非常简单的大小写字母转换程序 。
字符常量与字符串常量不同
字符串常量
定义:用双引号 (“”)括起来的字符序列
存储,每个字符串尾 自动 加一个 ‘ \0’ 作为字符串结束标志
h e l l o \0例 字符串,hello‖在内存中
a a \0例 ‘ a‘ ―a‖
例 空串,” \0
例,char ch;
ch=―A‖;
例,char ch;
ch=?A‘;
语言程序设计第二章基本数据类型及数据输入输出
C
没有 字符串变量,用字符数组存放
基本数据类型类型 符号 关键字 数的表示范围所占位数整型字符型实型有无
(signed)int 16 -32768~32767
(signed)short 16 -32768~32767
(signed)long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long
unsigned short 16 0~65535
有 float 32 3.4e-38~3.4e38
有 double 64 1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
说明,数据类型所占字节数随机器硬件不同而不同,上表以 IBM PC机为例,
语言程序设计第二章基本数据类型及数据输入输出
C
例 /*ch2_003.c*/
#define PRICE 12.5
main()
{ int num=3;
float total;
char ch1,ch2=?D‘;
total=num*PRICE;
ch1=ch2-?A‘+?a‘;
printf(―total=%f,ch1=%c\n‖,total,ch1);
}
宏定义变量定义输出结果运行结果:
total=37.500000,ch1=d
语言程序设计第二章基本数据类型及数据输入输出
C
2.3 常用 输入与输出函数
C语言无 I/O语句,I/O操作由函数实现
#include <stdio.h>
格式,printf(,格式控制串”,输出表列 );
功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回 EOF(-1)
2.3.1格式输出函数
输出表列:要输出的数据,通常是表达式,可以没有,多个时以?,?分隔)
格式控制串:包含两种信息:
格式说明,%[修饰符 ]格式字符 ---用于指定所输出的表达事的格式;
普通字符或转义序列:原样输出;
格式字符
d,i
x,X
o
u
c
s
e,E
f
g
%%
格式字符:
十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数
e和 f中较短一种百分号本身
int a=567;printf ( ―%d‖,a);
int a=255;printf(―%x‖,a);
int a=65;printf(―%o‖,a);
int a=567;printf(―%u‖,a);
char a=65;printf(―%c‖,a);
printf(―%s‖,―ABC‖);
float a=567.789;printf(―%e‖,a);
float a=567.789;printf(―%f‖,a);
float a=567.789;printf(―%g‖,a);
printf(―%%‖);
567
ff
101
567
A
ABC
5.677890e+02
567.789000
567.789
%
说明
格式字符要用小写
格式字符与输出项个数应相同,按先后顺序一一对应
输出转换,格式字符与输出项类型不一致,自动按指定格式输出例 main()
{ unsigned int u=65535;
printf(‖u=%d\n",u);
}
输出结果,u=-1
例 int a=3,b=4;
printf(―%d %d\n‖,a,b);
printf(―a=%d,b=%d\n‖,a,b);
例 int a=3,b=4;
printf(―%d %d\n‖,a,b);
printf(―a=%d,b=%d\n‖,a,b);
输出结果,3 4
a=3,b=4
11 11 11 11 11 11 11 11 65535
附加格式说明符(修饰符)
.n 对实数,指定小数点后位数 (四舍五入 )对字符串,指定实际输出位数修饰符 功 能
m 输出数据域宽,数据长度 <m,左补空格 ;否则按实际输出输出数据在域内左对齐(缺省右对齐 )-
指定在有符号数 的正数前显示正号 (+)+
输出数值时指定左面不使用的空位置自动填 00
在八进制和十六进制数前显示前导 0,0x#
在 d,o,x,u前,指定输出精度为 long型在 e,f,g前,指定输出精度为 double型l
例 2.4 main()
{
int n1,n2;
float f1,f2,sum;
char ch;
n1=65;
n2=?3;
f1=234.5;
f2=18.75;
sum=f1+f2;
ch='A';
printf("%d,%c,%d,%o,%f,%c,%d
",n1,n1,n2,n2,sum,ch,ch);
printf("%s","Very good!");
}
运行结果,65,A,–3,177775,253.250000,A,65,Very good!
例 static char a[]=―Hello,world!‖
printf(―%s\n%15s\n%10.5s\n%2.5s\n%.3s\n‖,a,a,a,a,a);
运行结果,Hello,world!
Hello,world!
Hello
Hello
Hel
例 int a=1234;
float f=123.456;
static char c[]=―Hello,world!‖;
printf(―%8d,%-8d\n‖,a,a);
printf(―%10.2f,%-10.1f\n‖,f,f);
printf(―%10.5s,%-10.3s\n‖,c,c);
运行结果,1234,1234
123.46,123.5
Hello,Hel
例 -
例 int a=1234;
float f=123.456;
printf(―%08d\n‖,a);
printf(―%010.2f\n‖,f);
printf(―%0+8d\n‖,a);
printf(―0+10.2f\n‖,f);
例 0,+
例 int a=123;
printf(―%o,%#o,%X,%#X\n‖,a,a,a,a);
例 #
例 long a=65536;
printf(―%d,%8ld\n‖,a,a);
例 l
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
//00001234
//0000123.46
//000+1234
//000+123.56
//173,0173,7B,0X7B
//0,65536
2.3.2 格式输入函数格式,scanf(―格式控制串,,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数
地址表:变量的地址,常用取地址运算符 &
格式字符,d,i,o,x,u,c,s,f,e
例 scanf(―%d‖,&a);
输入,10?
则 a=10
例 scanf(―%x‖,&a);
输入,11?
则 a=17
附加格式说明符(修饰符)
l
修饰符 功 能
h
m
*
用于 d,o,x前,指定输入为 short型整数用于 d,o,x前,指定输入为 long型整数用于 e,f前,指定输入为 double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例 scanf(“%4d%2d%2d”,&yy,&mm,&dd);
输入 19991015?
则 1999?yy,10?mm,15?dd
例 scanf(―%3d%*4d%f‖,&k,&f);
输入 12345678765.43?
则 123?k,8765.43?f
例 scanf(―%2d %*3d %2d‖,&a,&b);
输入 12 345 67?
则 12?a,67?b
例 s f(“%3c%2c”,&c1,&c2);
输入 abcde?
则‘ ac1,?dc2
输入分隔符的指定
一般以空格,TAB或回车键作为分隔符
其它字符做分隔符:格式串中两个格式符间字符例 scanf(“%d%o%x”,&a,&b,&c);
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
输入 123 123 123?
输出 a=123,b=83,c=291
例 scanf(―%d:%d:%d‖,&h,&m,&s);
输入 12:30:45?
则 12?h,30?m,45?s
例 scanf(―%d,%d‖,&a,&b)
输入 3,4?
则 3?a,4 b例 scanf(―a=%d,b=%d,c=%d‖,&a,&b,&c);输入 a=12,b=24,c=36?
说明:
用? %c”格式符时,空格和转义字符作为有效字符输入如 scanf(“%c%c%c”,&c1,&c2,&c3);
若输入 a b c?
则 a?c1,?c2,b?c3
输入数据时,遇以下情况认为该数据结束:
遇空格,TAB,或回车
遇宽度结束
遇非法输入如 scanf(―%d%c%f‖,&a,&b,&c);
若输入 1234a123o.26?
则 1234?a,?a‘?b,123?c
输入函数留下的? 垃圾?:
例 int x;
char ch;
scanf(―%d‖,&x);
ch=getchar();
printf(―x=%d,ch=%d\n‖,x,ch);
执行,123?
输出,x=123,ch=10
例 int x;
char ch;
scanf(―%d‖,&x);
scanf(―%c‖,&ch);
printf(―x=%d,ch=%d\n‖,x,ch);
执行,123?
输出,x=123,ch=10
解决方法:
( 1)用 getchar()清除
( 2)用函数 fflush(stdin)清除全部剩余内容
(3) 用格式串中空格或? %*c‖来? 吃掉?
例 int x;
char ch;
scanf(―%d‖,&x);
scanf(― %c‖,&ch);
或 scanf(―%*c%c‖,&ch);
#include <stdio.h>
main()
{ int c;
char a;
c=65; a='B';
putchar(c); putchar('\n'); putchar(a);
}
运行结果,A
B
2.3.3 字符输出函数 ------putchar()
格式,putchar( c )
参数,c为字符常量、变量或表达式功能:把字符 c输出到显示器上返值:正常,为显示的代码值;出错,为 EOF(-1)
格式,getchar( )
功能:从键盘读一字符返值:正常,返回读取的代码值;出错,返回 EOF(-1)
2.3.4 字符输入函数 ------getchar()
例
#include <stdio.h>
main()
{ int c;
printf("Enter a character:");
c=getchar();
printf("%c--->hex%x\n",c,c);
}
运行结果:
Enter a character:A?
A--->hex41
2.0预备知识
2.1常量与变量
2.2数据类型
2.3常用输出与输入函数练习与实践
§ 2.0 预备知识
计算机中数的表示及进制转换
数码、基与权
数码:表示数的符号
基:数码的个数
权:每一位所具有的值
数制
c
程序设计第二章基本数据类型及数据输入输出
C
数制基权表示数码特点
…,102,10110o
十进制数
0~9
10
逢十进一二进制数
0~1
2
…,22,21,2o
逢二进一八进制数
0~7
8
…,82,81,8o
逢八进一十六进制数
0~9,A~F,a~f
16
…,162,161,16o
逢十六进一十进制,4956= 4?103+9?102 +5?101+6?10o二进制,1011 1?23+0?22 +1?21+?2o十六进制,8 AE=8?163+?162 +10?1 1+14?16o八进制,275 2 8 7 8 5 8o
语言程序设计第二章数据描述
C
各种进制之间的转换
二进制、八进制、十六进制转换成十进制
方法:按权相加
100123452 59212120212121111011 )()(例
100128 94868381136 )()(例
10012316 7 9 7 81610162161516121 )()(例AF
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
各种进制之间的转换 (整数 )
二进制、八进制、十六进制转换成十进制
方法:按权相加
十进制转换成二进制、八进制、十六进制
原理:
的余数是
2
)2.,,,,,22(2
22.,,,,,22
).,,,,,(
0
0
0
1
2
1
1
0
0
1
1
1
1
2011
N
a
aaaa
aaaa
aaaaN
n
n
n
n
n
n
n
n
nn
方法:连续除以基,从低到高记录余数,直至商为 0
例 把十进制数 59转换成二进制数
592
292
142
72
32
12
0
(59)10=(111011)2
1
1
0
1
1
1
1 1 1 0 1 1
余余余余余余例 把十进制数 159转换成八进制数
1598
198
28
0
(159)10=(237)8
2 3 7
余 7
余 3
余 2
例 把十进制数 459转换成十六进制数
45916
2816
116
0
(459)10=(1CB)16
1 C B
余 11
余 12
余 1
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
二进制与八进制之间的转换
二进制转换成八进制:从右向左,每 3位一组(不足 3位左补 0),转换成八进制
八进制转换成二进制:用 3位二进制数代替每一位八进制数例 (1101001)2=(001,101,001)2=(151)8
例 (246)8=(010,100,110)2=(10100110)2
000 ~ 0
001 ~ 1
010 ~ 2
011 ~ 3
100 ~ 4
101 ~ 5
110 ~ 6
111 ~ 7
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
二进制与十六进制之间的转换
二进制转换成十六进制:从右向左,每 4位一组
(不足 4位左补 0),转换成十六进制
十六进制转换成二进制:用 4位二进制数代替每一位十六进制数例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16
例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2
0000 ~ 0
0001 ~ 1
0010 ~ 2
0011 ~ 3
0100 ~ 4
0101 ~ 5
0110 ~ 6
0111 ~ 7
1000 ~ 8
1001 ~ 9
1010 ~ A
1011 ~ B
1100 ~ C
1101 ~ D
1110 ~ E
1111 ~ F
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
字节和位
内存以字节为单元组成
每个字节有一个地址
一个字节一般由 8个二进制位组成
每个二进位的值是 0或 1
01234567
0
1
2
3
4
5
6
7
8
9
10 ……..
.
语言程序设计第二章数据描述
C
7
6
4
3
2
5
1
c
程序设计第二章基本数据类型及数据输入输出
数值的表示方法 ——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为 1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为 1,其余位为原码取反,再对整个数加 1
3
12
6
9
1
2
4
57
8
10
11
9-5=4
9+7=16=(14)12
< >
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出为什么用补码表示?
25-19=25+(-19)
(25)10=(00011001)2 (-19) 10 =(11101101) 2
00011001
+ 11101101
-----------------
100000110
c
程序设计第二章基本数据类型及数据输入输出
C
为什么用补码表示?
19 - 25 = 19 +(- 25)
(19)10=(00010011)2 (-25) 10 =(11100111) 2
00010011
+ 11100111
-----------------
11111010 -------(-6)?
引入补码之后符号位也进入了运算,不用再单独处理符号位
c
程序设计第二章基本数据类型及数据输入输出
C
原码 反码 补码
+7 00000111 00000111 00000111
-7 10000111 11111000 11111001
+0 00000000 00000000 00000000
-0 10000000 11111111 00000000
数的范围
01111111~
11111111
(-127~+127)
01111111~
10000000
(-127~+127)
01111111~
10000000
(-128~+127)
(用一字节表示数)
负数补码转换成十进制数:最高位不动,其余位取反加 1
例 补码,11111001
取反,10000110
加 1,10000111=-7
语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
§ 2.1 常量与变量
标识符
定义:用来标识变量、常量、函数等的字符序列
组成:
只能由 字母,数字,下划线 组成,且第一个字母必须是字母或下划线
大小写敏感
不能使用关键字
长度:最长 32个字符
命名原则:
见名知意
不宜混淆 如 l与 I,o与 0
例,判断下列标识符号合法性
sum Sum M.D.John day Date 3days
student_name #33 lotus_1_2_3
char a>b _above $123
M 3da
#33
$123a>b
语言程序设计第二章基本数据类型及数据输入输出
C
一般用大写字母
是宏定义预处理命令,不是 C语句
直接常量,
整型常量
实型常量
字符常量
字符串常量如 #define PRICE 30
常量
定义:程序运行时其值不能改变的量(即常数)
分类,
符号常量,用标识符代表常量
定义格式,#define 符号常量 常量例 符号常量举例
#define PRICE 30
main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}
运行结果,total=300
c
程序设计第二章基本数据类型及数据输入输出
C
编译程序根据变量定义为其分配指定字节的内存单元 …...
地址
int a=1,b=-3,c;
a
b
c
2字节
2字节
2字节地址地址
…...
内存
1
-3
随机数
变量 ------其值可以改变的量概念:
每个变量有一个名字:用标识符表示。
每个变量有一个存储空间(存储单元),该单元中的状态所表示的数为此时变量的值。
变量初始化,定义时可以赋初值合法标识符
变量的使用,先定义,后使用
变量定义的一般格式:
数据类型 变量 1[,变量 2,…,变量 n];
如,int a,b,c;
float x,y;
c
程序设计第二章基本数据类型及数据输入输出
C
例,
int a=2,b,c=4;
float data=3.67;
char ch=?A‘;
int x=1,y=1,z=1;
int x=y=z=1;
例 2
float a,b,c;
c=a%b; //Illegal use of floating point in function main
变量定义位置,一般 放在函数开头
main()
{ int a,b=2;
float data;
a=1;
data=(a+b)*1.2;
printf(―data=%f\n‖,data);
}
变量定义可执行语句
main()
{ int a,b=2;
a=1;
float data;
data=(a+b)*1.2;
printf(―data=%f\n‖,data);
}
语言程序设计第二章数据描述
C
例 1
int student;
stadent=19; //Undefined symbol?statent? in function main
每一个变量都有一个类型,表明了为它的存储属性,
分配空间的大小;
表示的数的范围;
所能进行的运算。
例 2.1
main()
{
float length,area,radius; /*length为周长,
area为面积,radius半径 */
printf("\nEnter a radius,");
scanf("%f",&radius);
length=2*PI*radius; /*计算圆的周长 */
area=PI*radius*radius; /*计算圆的面积 */
printf("\n length is,%f ",length);
printf("\n area is,%f ",area);
}
程序的运行情况为:
Enter a radius,2.8 ↙
length is,17.584000
area is,24.617599
§ 2.2 数据类型
数据类型总表
C
数据类型基本类型构造类型指针类型空类型 void
定义类型 typedef
字符类型 char
枚举类型 enum
整 型实型单精度型 float
双精度型 double
数组结构体 struct
共用体 union
短整型 short
长整型 long
整型 int
数据类型决定:
1,数据占内存字节数
2,数据取值范围
3,其上可进行的操作语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
2.2.1整数类型整数类型的标识符是 int。 整型数据根据其占用的内存字节数不同,可加限定词:
short(短整型 ),int,long(长整型 ),
short≤int≤long
可用 sizeof(类型标识符)测量
unsigned short (无符号短整型 ),
unsigned int (无符号整型 ),
unsigned long (无符号长整型 ),
其中 short和 long的引入是为满足实际要求的不同长度的整数,而经 unsigned限定词限定的整数总是正的 。
c
程序设计第二章基本数据类型及数据输入输出
C
01 11 11 11 11 11 11 11int型,最大,32767
10 00 00 00 00 00 00 00 最小,-32768
11 11 11 11 11 11 11 11unsigned int型,最大,65535
00 00 00 00 00 00 00 00 最小,0
语言程序设计第二章数据描述
C
整型常量(整常数)
三种形式:
十进制整数:由数字 0~9和正负号表示,如 123,-456,0
八进制整数:由数字 0开头,后跟数字 0~7表示,如 0123,011
十六进制整数:由 0x开头,后跟 0~9,a~f,A~F表示,
如 0x123,0Xff
例 12 与 12L例 30000 为 int型65536 为 long int 型问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
83
291
255
问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
c
程序设计第二章基本数据类型及数据输入输出
C
c
程序设计第二章基本数据类型及数据输入输出
C
整型常量的类型
根据其值所在范围确定其数据类型:
一个整数若值在 -32768~ 32767内,则默认为它是 int型;一个整数若值在 -2147483648~ 2147483647之间,可使用长整型常量表示。
在 整常量后加字母 l或 L,认为它是 long int 型常量
无符号数也可用后缀表示,整型常数的无符号数的后缀为? U”或
u”。
例如,358u,0x38Au,235Lu 均为无符号数; 0XA5Lu表示十六进制无符号长整数 A5,其十进制为 165。
一个非负的整数,只要它的值不超过相应变量的取值范围,就可以赋给 unsigned型变量。例如,可以将 6000赋给一个
unsigned int型变量,但却不可以将 66000赋给一个 unsigned int
型变量(将会出现溢出错误)
整型变量定义方法:
int a1,a2;
unsigned int b1,b2;
一个整型常量只可以赋给能容纳下其值的整型变量 。
如 a1,a2的取值范围为 -32768----32767
b1,b2的取值范围为 0----65535
如果,a1=65535;
或者,b1=-1;
在内存中数值将不是所赋的数值。
c
程序设计第二章基本数据类型及数据输入输出
C
2.2.2 实数类型实数类型分为单精度 ( float) 和双精度
( double) 类型,二者的区别在于所占存储位的多少,从而决定了其取值范围 。
通常以 32位 ( bits) 来存储单精度实数型数据,以 64位来存储双精度实型数据 。
c
程序设计第二章基本数据类型及数据输入输出
C
实型常量(实数或浮点数)
表示形式:
十进制数形式,由数字和小数点组成,小数点的左右至少一边要有数字。 (必须有小数点) 如 0.123,.123,123.0,
0.0,123.
指数形式,由尾数,e或 E和指数部分组成,E的两边都至少要有一位数且 E的右边只允许是整数形式 ( e或 E之前必须有数字;
指数必须为整数)如 12.3e3,123E2,1.23e4,e-5,
1.2E-3.5
实型常量的类型
默认 double型
在 实型常量后加字母 f或 F,认为它是 float 型语言程序设计第二章数据描述
Cc
程序设计第二章基本数据类型及数据输入输出
实型变量实型变量的说明形式如下,
float 变量名 1[,变量名 2,…… 变量名 n];
double 变量名 1[,变量名 2,…… 变量名 n];
float,占 4字节,提供 7位有效数字
double,占 8字节,提供 15~16位有效数字例 float a;
a=111111.111; /* a=111111.1*/
double b;
b=111111.111; /* b=111111.111*/
float a,b,c;
double x,y;
语言程序设计第二章基本数据类型及数据输入输出
C
【 例 2.2】 实型变量的有效数字 。
main( )
{ double a;
a=6.152367864359046178294901;
printf("\n%25.20f",a);
}
输出结果为:
6.15236786435904648000
在这个例子中,a被赋值了一个有效位数为 25位的数字 。 但由于 a是
double类型的,所以 a只能接收 15~16位有效数字 。 在 printf语句中,我们使用了 %20.18f这样的格式符号,这指示 printf语句在输出 a时总长度应为 25位,小数点位数占 20位 。 输出的结果显然显示了 25位数,但只有
6.152367864359046共 16位有效数字被正确显示出来,后面的数字是一些无效的数值 。 这就表明 double型的数据只接收 15~16位有效数字 。
语言程序设计第二章基本数据类型及数据输入输出
C
2.2.3 字符类型整 型,实 型都是数值型,是大家比较熟悉的 。
除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型 。
字符型数据包含的是一个字符集 。 一般用的是
ASCII码字符集见附录 A(p249) 。
字符集中的每一个字符都有一个序号,称为
ASCII码 。 ASCII码大的字符比 ASCII码小的字符值大 。
字符类型的标识符是 char。
语言程序设计第二章基本数据类型及数据输入输出
C
字符常量
定义,用 单引号 括起来的单个 普通字符 或 转义字符,
字符常量的 值,该字符的 ASCII码 值
<
转义字符及其含义:
转义字符 含义
\n
\v
\r
\a
\?
\ddd
\t
\b
\f
\\
\―
\xhh
转义字符 含义换行垂直制表回车响铃单引号
3位 8进制数代表的字符水平制表退格换页反斜线双引号
2位 16进制数代表的字符如 ‘ \101‘ -----------?A‘?\012‘ -----------‘\n‘
\376‘ -----------‘?‘?\x61‘ -----------‘a‘
\60‘ -----------‘0‘?\483‘ ----------(?)
例,
A‘-------‘\101‘-------‘\x41‘--------65
如 ‘ A‘——65,‘ a‘——97,
‘ 0‘——48,?\n‘——10
如 ‘ aA\n\101?
转义字符,反斜线后面跟一个字符或一个代码值表示例 转义字符举例 (ch2_001.c,ch2_004.c)
main()
{
printf("\101 \x42 C\n");
printf("I say:\"How are you?\"\n");
printf("\\C Program\\\n");
printf("Turbo \'C\'");
}
运行结果,(屏幕显示 )
A B C
Isay:”How are you?”
\C Program\
Turbo?C?
例 main()
{ printf(―Y\b=\n‖);
}
运行结果:
屏幕显示,=
打印机输出,¥
语言程序设计第二章基本数据类型及数据输入输出
C
字符型变量
char 变量名 1,[变量名 2,......变量名 n];
如,char c1,c2 ;
一个字符型变量的值只能是一个单个字符; 在内存中占一个字节 ;
字符变量存放的是字符的 ASCII码 ;
char与 int数据间可进行算术运算 ;
由于字符型变量在内存中是以字符的 ASCII码 —一个无符号整数的形式来存放的,所以在 一定范围 内,
字符型数据和整型数据是可以互相通用的,二者的区别仅在于:字符型常量占一个字节,而整型常量占两个字节。
例 a=?D‘; /* a=68; */
x=?A‘+5; /* x=65+5; */
s=?!‘+?G‘ /* s=33+71; */
语言程序设计第二章基本数据类型及数据输入输出
C
【 例 2.3】 将小写字母转化为大写字母 。
main( )
{char c1,c2;
c1='x';c2='y';
c1=c1?32;
c2=c2?32;
printf("\n%c,%c",x1,x2);
}
程序的输出结果是,X,Y
这个例子是将小写字母转化为大写字母的程序 。 我们在对
ASCII码字符表进行观察后会发现,大小写对应的字母,它们之间的 ASCII码正好相差 32。 利用这个特性和上一个特性,
我们可以编写出非常简单的大小写字母转换程序 。
字符常量与字符串常量不同
字符串常量
定义:用双引号 (“”)括起来的字符序列
存储,每个字符串尾 自动 加一个 ‘ \0’ 作为字符串结束标志
h e l l o \0例 字符串,hello‖在内存中
a a \0例 ‘ a‘ ―a‖
例 空串,” \0
例,char ch;
ch=―A‖;
例,char ch;
ch=?A‘;
语言程序设计第二章基本数据类型及数据输入输出
C
没有 字符串变量,用字符数组存放
基本数据类型类型 符号 关键字 数的表示范围所占位数整型字符型实型有无
(signed)int 16 -32768~32767
(signed)short 16 -32768~32767
(signed)long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long
unsigned short 16 0~65535
有 float 32 3.4e-38~3.4e38
有 double 64 1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
说明,数据类型所占字节数随机器硬件不同而不同,上表以 IBM PC机为例,
语言程序设计第二章基本数据类型及数据输入输出
C
例 /*ch2_003.c*/
#define PRICE 12.5
main()
{ int num=3;
float total;
char ch1,ch2=?D‘;
total=num*PRICE;
ch1=ch2-?A‘+?a‘;
printf(―total=%f,ch1=%c\n‖,total,ch1);
}
宏定义变量定义输出结果运行结果:
total=37.500000,ch1=d
语言程序设计第二章基本数据类型及数据输入输出
C
2.3 常用 输入与输出函数
C语言无 I/O语句,I/O操作由函数实现
#include <stdio.h>
格式,printf(,格式控制串”,输出表列 );
功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回 EOF(-1)
2.3.1格式输出函数
输出表列:要输出的数据,通常是表达式,可以没有,多个时以?,?分隔)
格式控制串:包含两种信息:
格式说明,%[修饰符 ]格式字符 ---用于指定所输出的表达事的格式;
普通字符或转义序列:原样输出;
格式字符
d,i
x,X
o
u
c
s
e,E
f
g
%%
格式字符:
十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数
e和 f中较短一种百分号本身
int a=567;printf ( ―%d‖,a);
int a=255;printf(―%x‖,a);
int a=65;printf(―%o‖,a);
int a=567;printf(―%u‖,a);
char a=65;printf(―%c‖,a);
printf(―%s‖,―ABC‖);
float a=567.789;printf(―%e‖,a);
float a=567.789;printf(―%f‖,a);
float a=567.789;printf(―%g‖,a);
printf(―%%‖);
567
ff
101
567
A
ABC
5.677890e+02
567.789000
567.789
%
说明
格式字符要用小写
格式字符与输出项个数应相同,按先后顺序一一对应
输出转换,格式字符与输出项类型不一致,自动按指定格式输出例 main()
{ unsigned int u=65535;
printf(‖u=%d\n",u);
}
输出结果,u=-1
例 int a=3,b=4;
printf(―%d %d\n‖,a,b);
printf(―a=%d,b=%d\n‖,a,b);
例 int a=3,b=4;
printf(―%d %d\n‖,a,b);
printf(―a=%d,b=%d\n‖,a,b);
输出结果,3 4
a=3,b=4
11 11 11 11 11 11 11 11 65535
附加格式说明符(修饰符)
.n 对实数,指定小数点后位数 (四舍五入 )对字符串,指定实际输出位数修饰符 功 能
m 输出数据域宽,数据长度 <m,左补空格 ;否则按实际输出输出数据在域内左对齐(缺省右对齐 )-
指定在有符号数 的正数前显示正号 (+)+
输出数值时指定左面不使用的空位置自动填 00
在八进制和十六进制数前显示前导 0,0x#
在 d,o,x,u前,指定输出精度为 long型在 e,f,g前,指定输出精度为 double型l
例 2.4 main()
{
int n1,n2;
float f1,f2,sum;
char ch;
n1=65;
n2=?3;
f1=234.5;
f2=18.75;
sum=f1+f2;
ch='A';
printf("%d,%c,%d,%o,%f,%c,%d
",n1,n1,n2,n2,sum,ch,ch);
printf("%s","Very good!");
}
运行结果,65,A,–3,177775,253.250000,A,65,Very good!
例 static char a[]=―Hello,world!‖
printf(―%s\n%15s\n%10.5s\n%2.5s\n%.3s\n‖,a,a,a,a,a);
运行结果,Hello,world!
Hello,world!
Hello
Hello
Hel
例 int a=1234;
float f=123.456;
static char c[]=―Hello,world!‖;
printf(―%8d,%-8d\n‖,a,a);
printf(―%10.2f,%-10.1f\n‖,f,f);
printf(―%10.5s,%-10.3s\n‖,c,c);
运行结果,1234,1234
123.46,123.5
Hello,Hel
例 -
例 int a=1234;
float f=123.456;
printf(―%08d\n‖,a);
printf(―%010.2f\n‖,f);
printf(―%0+8d\n‖,a);
printf(―0+10.2f\n‖,f);
例 0,+
例 int a=123;
printf(―%o,%#o,%X,%#X\n‖,a,a,a,a);
例 #
例 long a=65536;
printf(―%d,%8ld\n‖,a,a);
例 l
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
//00001234
//0000123.46
//000+1234
//000+123.56
//173,0173,7B,0X7B
//0,65536
2.3.2 格式输入函数格式,scanf(―格式控制串,,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数
地址表:变量的地址,常用取地址运算符 &
格式字符,d,i,o,x,u,c,s,f,e
例 scanf(―%d‖,&a);
输入,10?
则 a=10
例 scanf(―%x‖,&a);
输入,11?
则 a=17
附加格式说明符(修饰符)
l
修饰符 功 能
h
m
*
用于 d,o,x前,指定输入为 short型整数用于 d,o,x前,指定输入为 long型整数用于 e,f前,指定输入为 double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例 scanf(“%4d%2d%2d”,&yy,&mm,&dd);
输入 19991015?
则 1999?yy,10?mm,15?dd
例 scanf(―%3d%*4d%f‖,&k,&f);
输入 12345678765.43?
则 123?k,8765.43?f
例 scanf(―%2d %*3d %2d‖,&a,&b);
输入 12 345 67?
则 12?a,67?b
例 s f(“%3c%2c”,&c1,&c2);
输入 abcde?
则‘ ac1,?dc2
输入分隔符的指定
一般以空格,TAB或回车键作为分隔符
其它字符做分隔符:格式串中两个格式符间字符例 scanf(“%d%o%x”,&a,&b,&c);
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
输入 123 123 123?
输出 a=123,b=83,c=291
例 scanf(―%d:%d:%d‖,&h,&m,&s);
输入 12:30:45?
则 12?h,30?m,45?s
例 scanf(―%d,%d‖,&a,&b)
输入 3,4?
则 3?a,4 b例 scanf(―a=%d,b=%d,c=%d‖,&a,&b,&c);输入 a=12,b=24,c=36?
说明:
用? %c”格式符时,空格和转义字符作为有效字符输入如 scanf(“%c%c%c”,&c1,&c2,&c3);
若输入 a b c?
则 a?c1,?c2,b?c3
输入数据时,遇以下情况认为该数据结束:
遇空格,TAB,或回车
遇宽度结束
遇非法输入如 scanf(―%d%c%f‖,&a,&b,&c);
若输入 1234a123o.26?
则 1234?a,?a‘?b,123?c
输入函数留下的? 垃圾?:
例 int x;
char ch;
scanf(―%d‖,&x);
ch=getchar();
printf(―x=%d,ch=%d\n‖,x,ch);
执行,123?
输出,x=123,ch=10
例 int x;
char ch;
scanf(―%d‖,&x);
scanf(―%c‖,&ch);
printf(―x=%d,ch=%d\n‖,x,ch);
执行,123?
输出,x=123,ch=10
解决方法:
( 1)用 getchar()清除
( 2)用函数 fflush(stdin)清除全部剩余内容
(3) 用格式串中空格或? %*c‖来? 吃掉?
例 int x;
char ch;
scanf(―%d‖,&x);
scanf(― %c‖,&ch);
或 scanf(―%*c%c‖,&ch);
#include <stdio.h>
main()
{ int c;
char a;
c=65; a='B';
putchar(c); putchar('\n'); putchar(a);
}
运行结果,A
B
2.3.3 字符输出函数 ------putchar()
格式,putchar( c )
参数,c为字符常量、变量或表达式功能:把字符 c输出到显示器上返值:正常,为显示的代码值;出错,为 EOF(-1)
格式,getchar( )
功能:从键盘读一字符返值:正常,返回读取的代码值;出错,返回 EOF(-1)
2.3.4 字符输入函数 ------getchar()
例
#include <stdio.h>
main()
{ int c;
printf("Enter a character:");
c=getchar();
printf("%c--->hex%x\n",c,c);
}
运行结果:
Enter a character:A?
A--->hex41