- 一、scanf()
- ①控制字符
- ②参数列表
- ③间隔符
- 二、printf()
- ①类型控制符(scanf一样)
- ②占位控制
- 三、scanf和printf的异同
- 四、getchar、putchar、gets、puts
- 1.getchar(void)
- 2.putchar(int ch)
- 3.gets(char *str)
- 4.puts(const char *s)
格式化输入输出函数,能够对各种类型的数据混合地输入输出,主要是依靠一个格式控制字符串来实现的。在格式控制字符串内通过%符号加字母,对输入输出的目标数据的类型进行预先标明。控制字符串内的%符号后面的字母,我们称之为输入输出控制符。控制字符串内的每一个控制符,在控制字符串后面必须有一个相应类型的常量、变量或表达式。控制串内的控制字符与控制串后面的输入输出目标,在类型与个数上必须是一一对应的,否则在输入输出时就会出现混乱。 一、scanf() ①控制字符
控制字符串也就是双引号内的部分,只允许放两种文字:控制符与间隔符。
控制字符串内多段控制符之间,只能是空格、逗号或者单独指定的某种间隔符。如果在控制串内随意加入一些文字,尤其是想把要打印的文字放入scanf函数的控制字符串内,那将是非常错误的。
scanf的参数列表内,带入的每个变量都必须用&符号取变量的地址。取变量的地址带入之后,在输入数据之后scanf才将用户输入的数据,能按照每个变量的地址送入到对应的变量中。
普通的整型、浮点数等类型的变量,代入到scanf的参数列表时必须取地址。
否则,如果不取地址scanf函数会将变量内的数值当做内存地址。
只有数组型变量可以不用取地址带入scanf函数,运行时用户输入数据之后程序也正常运行不会出错。原因是数组型变量自身就是一个内存地址,因此在scanf函数中数组型变量前可以不用加取地址符号&。
③间隔符scanf函数的控制串内,除了控制符(%号加一个字母)之外,其余的文字都应该算作是间隔符。
例如:两段控制符之间用空格间隔,用户输入数据时就必须用空格间隔;如果两段控制符之间用逗号,用户输入时就必须用逗号间隔;如果两段控制符之间没有间隔符,缺省用户还是要用空格做间隔符。
printf函数打印时的占位控制方式,包括:整数占位控制、浮点数占位控制以及字符串占位控制等。
一、浮点数占位控制方式分为以下几种情况:
1.%f(或%lf):不指定宽度,整数部分全部输出并输出6位小数。
printf("%f", 34.67852f); printf("%lf", 254.0 / 3);
2.%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。(小数点也算进m)
当m为0时,则不申请占位,按整数与小数自然需求占用。
printf("%8.3f", 34.67852f); 结果:空空34.678
3.%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。(小数点也算进m)
当m为0时,则不申请占位,按整数与小数自然需求占用。
printf("%-8.3f",34.678f); 结果:34.678空空
二、整数和字符串相同,只有占位控制和对齐控制,没有小数位控制:
1.%md或%-md:-符号代表左对齐,缺省不带-符号是右对齐。
printf("%-8d%10sn",1005, "张珊"); // 8和10代表的是占位管理 printf("%-8d%10sn",1006, "李思思"); // 8和10代表的是占位管理
2. 右对齐时缺省占位符是空格,如果在%符号后加一个0则以0占位
printf("%08d%-10sn",1006, "李思思");
占位控制在后期项目开发中,常用与数据集合的列表打印,让各种不同长度的数据在列表中对齐。另外,在打印一个内存地址时,占位控制也很好用。例如:
int i = 88;
printf(“i变量的内存地址是:0x%08xn”,&i);
一、相同点:
a) printf与scanf函数在格式上相似,也是分为控制字符串与列表参数两部分;
b)参数列表内输入输出目标的个数可以是很多个(没有上限),类型也可以是多种多样的;
c)控制串内的控制符与控制串后的参数列表中的输入输出目标,在个数与类型上必须一一对应的;
二、不同点:
a) scanf函数在参数列表中的每一项,必须是变量而不能是常量,而且必须对每一个变量取地址(数组除外);
b) printf函数在参数列表中的每一项,可以是变量也可以是常量或者其他表达式,而且即使是变量取地址或不取地址都是可以的;
c)printf函数参数列表中的变量,如果取地址打印的就是变量的地址,否则打印的就是变量内的数值。
d)scanf函数的控制串内只能有控制符与间隔符,而printf函数可以将各种文字与控制符混合在一起输出;
e)scanf函数的控制串内的控制符,或者参数列表内的变量个数至少是1个。而printf函数的控制串内的控制符个数,或者参数列表内的目标个数可以是0个,代表简单文字输出;
得到的是数值类型数据
【返回值】函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕
int in = getchar(); putchar(in);
如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
2.putchar(int ch)输出的是一个字符
【参数】 ch为要输出的字符
【返回值】 输出成功,返回该字符的ASCII码值,否则返回EOF
putchar(97); 结果:a putchar('A'); 结果:A char int short float double ch='A'; putchar(ch); 结果:A3.gets(char *str)
只有一个参数,str 可以是一个字符指针变量名,也可以是一个字符数组名
char s[20]; gets(s);4.puts(const char *s)
只能输出字符串,并且输出结束后会自动换行
s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量
char s[]="做富人"; puts(s); puts("做富人"); 等价于 printf("%sn","做富人");
输出时只有遇到 ‘’ 也就是字符串结束标志符才会停止。
char s[]="做富人做富人"; puts(s); //结果:做富人
如果 puts() 后面的参数是字符指针变量或字符数组,那么括号中除了字符指针变量名或字符数组名之外什么都不能写
char s[]="做富人" puts(输出结果是:s); //错误 puts(s); // 正确
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)