C语言输出
puts();:只能输出字符串,在结束后自动换行。
putchar();:输出单个字符。
printf();:可是通过格式控制符输出各种类型的数据,是最灵活、最复杂、最常用的输出函数。
- 主要讲printf()格式控制符
printf() 格式控制符的完整形式如下:
%[flag][width][.precision]type([ ] 表示此处的内容可有可无,是可以省略的。)
1>type表示输出类型。
2>flag是标志字符。
| 符号 | 作用 |
|---|---|
| "- " | 表示左对齐,默认右对齐 |
| “+” | 用于整数或者小数,表示输出符号(正负号) |
| " " | 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。 |
| “#” | 对于八进制和十六进制,表示在输出前添加前缀。对于小数,强迫输出小数点。 |
| “0” | 用前导0来代替空格填充字段宽度 |
3>width表示输出宽度。当输出的结果不足width,以空格补齐。否则,width无作用。
4>.precision 表示输出精度,也就是小数的位数。 原输出数据不足设置精度,四舍五入舍弃剩余位。否则,在其后补0.
-
“”修饰符(修改转换说明的含义)
在printf()格式控制符中用法:不想预先指定字段宽度,希望程序运行中指定,就可以用“”修饰符代替字段宽度,但还是要用一个参数来告诉函数,字段宽度是多少。
ex:printf("%*d",&width,&number); -
printf返回值
返回打印字符的个数(包括不见的空格和换行符)。printf()的返回值是其打印输出功能的附带用途,平时很少用到。 -
printf使用注意事项
不能在双引号括起来的中间断行。解决办法:
1.在断行前加一个“\”就会避免出错。
2.在两个用双引号括起来的字符串之间用空白隔开,c编译器会自动将其视为一个字符串。 -
printf转换说明
C语言输入
- gets():能读取含有空格的字符串,scanf不能。
- getchar():相当于scanf("%c",m);,除了更加简洁,没有别的优势。
- getche():它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和 scanf()getchar() 的最大区别。
- getch():getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,它没有回显,看不到输入的字符。
- scanf()(scan format格式化扫描)
可以输入多种类型的数据,是最灵活的输入函数。
scanf() 可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch() 和 gets() 每次只能读取一份特定类型的数据,不能一次性读取多份数据。
主要写scanf的知识点
-
scanf() 控制字符串的完整写法为:
%{*} {width} type
其中,{ } 表示可有可无。各个部分的具体含义是:
type表示读取什么类型的数据,例如 %d、%s、%[a-z]、%[^\n] 等;type 必须有。
width表示最大读取宽度,可有可无。
*表示丢弃读取到的数据,可有可无。
-
scanf高级用法
1>指定读取长度
在格式控制符的中间加一个数字,用来表示读取数据的最大长度。
作用:限制读取数据的长度在实际开发中非常有用,最典型的一个例子就是读取字符串:我们为字符串分配的内存是有限的,用户输入的字符串过长就存放不了了, 就会冲刷掉其它的数据,从而导致程序出错甚至崩溃;如果被黑客发现了这个漏洞,就可以构造栈溢出攻击,改变程序的执行流程,甚至执行自己的恶意代码,这对服务器来说简直是灭顶之灾。2>匹配特定的字符(可以使用连接符)
-
%s 控制符会匹配除空白符以外的所有字符,它有两个缺点:
a.%s 不能读取特定的字符,比如只想读取小写字母,或者十进制数字等,%s 就无能为力;
b.%s 读取到的字符串中不能包含空白符 -
%[xxx],[ ]包围起来的是需要读取的字符集合。
ex:
scanf("%[abcd]",&c);
%[abcd]表示只读取字符abcd,遇到其它的字符就读取结束
使用连接符:为了简化字符集合的写法,scanf() 支持使用连字符-来表示一个范围内的字符,例如 %[a-z]、%[0-9] 等。 -
不匹配特定字符(可以使用连接符)
%[ ]中直接指定某些不能匹配的字符,具体方法就是在不匹配的字符前面加上^
ex:%[^0-9]
表示匹配除十进制数字以外的所有字符,遇到十进制数字就停止读取。 -
丢弃读取到的字符
每个格式控制符都要对应一个变量,把读取到的数据放入对应的变量中。其实你也可以不这样做,
scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*
ex:%*[a-z]
表示读取小写字母并丢弃
高级用法示例:
读取一行不能包含十进制数字的字符串,并且长度不能超过30
ex:scanf("%30[^0-9\n]", str);
- scanf的返回值
返回值为成功读取的项数。
主要用法:利用返回值,用if语句和while语句,检测和处理不匹配的输入。 - “*”修饰符(修改转换说明的含义)
把“*”放在%和转换字符之间,会使得scanf跳过相应的输入项,,也就是此次输出无效,将这次输入的值赋给下一个变量。 - scanf转换说明