输入&输出
输出——printf()
转换说明要与数值类型相符;
转换说明个数要与,参数个数相符;
常用的转换说明
在printf()中没有%lf的定义
%c | 字符 |
%d | 十进制整型 |
%o | 无符号八进制整型 |
%x(%X) | 无符号十六进制整型 |
%f | 浮点数 |
%s | 字符串 |
%p | 指针 |
常用的转换说明修饰符
标记 | (-、+、空格、#、0)可以不使用标记或使用多个标记。例:%-2d |
数字 | 最小字段宽度(如果该字段不能容纳待打印的数字或字符串,系统自动使用更宽的字段)。例:%4d |
.数字 | 精度。例:%4.2 打印一个浮点数,字段宽度为4,小数点后有两位数字 |
标记
- | 待打印项左对齐(从字段最左侧开始打印) |
+ | 有符号值,为正,值前加+;为负,值前加- |
空格 | 有符号值,为正,值前加前导空格;为负,值前加-+空格 |
# | 将结果转化为另一种形式。例:%#o 增加八进制前导,以0开始。(023(o)->19(d)) %#x 增加十六进制前导,以0x或0X开始。 (0x23(o)->35(d)) |
0 | 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-或精度,则忽略该标记。 常用的转义序列 |
常用的转义序列
\a | 警报 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\? | 在书写连续多个问号使用时,防止他们被解析成三字母词 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 |
\xdd | dd表示2个十六进制数字。 如: \x30 |
#include<stdio.h>
int main()
{
printf("%d\n",strlen("abcd"));
// \t \328
printf("%d\n",strlen("c:\test\328\test.c"));
return 0;
}
返回值
返回所打印的字符数量,如果有输出错误则返回一个负值。
#include<stdio.h>
int main()
{
printf("%d",printf("%d\n",printf("1234\n")));
return 0;
}
输入——scanf()
输入实质为字符流
读取基本数据类型,变量名前加&;
读取字符串,变量名前不使用&;
读取时遇到空白字符停止;
会在第一个出错处停止读取;
转换说明修饰符
scanf()可以通过 l 修饰 %f 即 %lf 将数据存储为double类型
* | 抑制赋值 |
数字 | 最大字段宽度。输入达到最大宽度时停止 |
scanf()函数允许将出空格以外的普通字符放入格式字符串中,但在输入时需要与格式字符串匹配;
scanf()角度看输入
假设scanf ()根据-个%d 转换说明读取-一个整数。
scanf ()函数每次读取-一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。
因为要读取整数,所以scanf ()希望发现-一个数字字符或者-一个符号(+或-)。
如果找到一个数字或符号,它便保存:该字符,并读取下一个字符。
如果下一一个字符是数字,它便保存该数字并读取下- -个字符。
scanf ()不断地读取和保存字符,直至遇到非数字字符。
如果遇到一个非数字字符,它便认为读到了整数的末尾。
然后,scanf ()把非数字字符放回输入。
这意味着程序在下一次读取输入时,首先读到的是上-次读取丢弃的非数字字符。
最后,scanf ()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。
如果使用字段宽度, scanf ()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停 止)。
如果第1个非空白字符是A而不是数字,会发生什么情况?
scanf ()将停在那里,并把A放回输入中,不会把值赋给指定变量。
程序在下一次读取输入时,首先读到的字符是A。如果程序只使用%d转换说明,scanf()就-直无法越过A读下一-个字符。
另外,如果使用带多个转换说明的scanf(), C规定在第1个出错处停止读取输入。
用其他数值匹配的转换说明读取输入和用%d的情况相同。
区别在于scanf()会把更多字符识别成数字的一部分。
例如, %x转换说明要求scanf ()识别十六进制数a~f和A~F。浮点转换说明要求scanf()识别小数点、e记数法(指数记数法)
和新增的p记数法(十六进制指数记数法)。
如果使用%s转换说明,scanf ()会读取除空白以外的所有字符。
scanf ()跳过空白开始读取第1个非空白字符,并保存非空白字符直到再次遇到空白。
这意味着scanf ()根据%s转换说明读取一个单词,即不包含空白字符的字符串。
如果使用字段宽度,scanf() 在字段末尾或第1个空白字符处停止读取。
无法利用字段宽度让只有一个%s的scanf()读取多个单词。
最后要注意一点:当scanf ()把字符串放进指定数组中时,它会在字符序列的末尾加上'\0',让数组中的内容成为一个C字符串。
getchar()
通过键盘键入获取一个字符(所有字符)
putchar()
输出字符
gets()
通过键盘键入获取字符串
char ch;
ch=getchar();
putchar(ch);
#include<stdio.h> //读取带空格的字符串,代码实现
int main()
{
char str[100];
while((ch[i]=getchar())!='\n')
{
i++;
}
str=gets();
return 0;
}
格式字符串中的普通字符
scanf()函数允许把函数普通字符放在格式字符串中。除空格字符外的;普通字符必须与输入字符串严格匹配。
除%c,其他转换说明都会自动跳过带输入值前面所有的空白
scanf("%d,%d",&n,&m);
8,21 (1.0)
8, 21 (2.0)
8,
21 (3.0)
scanf("%d%d",&n,&m)
//等价于
scanf("%d %d",&n,&m)
返回值
返回成功读取的项数;当scanf()检测到文件结尾时会返回EOF;
输入验证
/*
输入一个数字
***数值大于0
***输入错误后重新输入
*/
#include<stdio.h>
int main()
{
int n;
char ch;
while(scanf("%d",&n)!=1&&n<1) //根据scanf()返回值判断输入是否与转换说明相同
{ //如果不符,输入字符就会停留在队列。下一次scanf()直接吸收队列中的错误字符
while((ch=getchar())!='\n') //通过getchar()吸收队列中的错误字符,
{
continue;
}
scanf("%d",&n);
}
}
最难不过坚持!