本文内容包含printf()函数和scanf()函数的有关知识
声明:内容来源于个人学习记录,目的仅是用于个人复习!且可能存在错误!
printf()函数
1.转换说明
如%i 有符号十进制(与%d相同)
%o 有符号八进制 %x或%X 有符号十六进制 %p 指针
%% 打印一个% %g/%G 根据数值的不同自动选用 %f/%F 或 %e/%E(%e/%E格式用于指数小于-4或者大于等于精度时)
2.转换说明修饰符
五种标记
- 将打印项左侧对其 + 有符号值为正则在前加+,负值加-
空格 有符号值为正则在前加空格,负值加-
# 在十六进制前加上0x或者0X八进制前加上0, 对于浮点格式保证后面没数也能打印一个小数点, 对于%g 或 &G防止结果后面的0被删除
0 用0代替空格填充字符宽度.对于整形格式若出现-(减号)或者给定精度则无视0
数字 最小字段宽度(如果不足以打印字段则会自动拓宽)
.数字
对于浮点转换. 表示打印数字的小数位数
对于%e %E表示小数点右边数字的位数; 对于%g %G表示有效数字最大位数;
对于%s 表示打印字符的最大数量
对于整形转换,表示打印数字的最小位数
其它
j 与整形转换说明一起使用, 表示intmax_t 或 uintmax_t类型的值
t 与整形转换说明一起使用, 表示ptrdiff_t类型的值(ptrdiff_t是两指针差值)
z 与整形转换说明一起使用, 表示size_t 类型的值
h 与整形转换说明一起使用, 表示short int, unsigned short int等连用, 如%hd %hu
hh 与整形转换说明一起使用, 表示signed char 或 unsigned char类型的值
l 与整形转换说明一起使用, 表示 long int 或 unsigned long int 类型的值
ll 与整形转换说明一起使用, 表示 long long int 或 unsigned long long int 类型的值
L 与浮点转换说明一起使用, 表示 long double类型的值
3.printf()的返回值
printf()会返回打印字符的个数(包括空格,换行符,字符等)
scanf()函数
scanf()读取基本变量类型的值要加&,字符串读入字符数组中不用&
字符串可以储存在数组之中,如
char name[20]; //name数组有20个char类型元素的数组
1.转换说明
%s 把输入解释成字符串(从第一个非空白字符开始到下一个空白字符之前的所有字符都是输入)
%p 把输入解释成指针
%e%E%f%F%g%G%a%A 都可以将输入解释为浮点数(C99加入的%a%A)
%d%c%o%x%X%u 用法与printf()类似
2.转换说明修饰符
* 抑制赋值
数字 最大字符宽度,或第一次遇到空白字符时停止
z 整形转换说明后应用,sizeof返回类型(C99)
t 两个指针差值的类型(C99)
hh
ll
h
l/L
未具体说明的与printf()中转换修饰符类似
3.scanf()的返回值
scanf()的返回值为成功读取的项数, 如果没有成功读取任何项,且需要读取一个数字而用户却输入一个非数字的字符串时候则返回0
4.scanf()输入的连续性
有以下代码,
#include<stdio.h>
int main(void)
{
char ch;
scanf("%c", &ch);
while (ch != 'g')
{
printf("%c", ch);
scanf("%c", &ch);
}
return 0;
假设输入值为
asd fgh jkl
则输出为
asd f
原因如下(来自站内大佬的解释)
scanf("%c", &ch) 读入由终端输入的第一个字符。输入“Enter”后执行函数。因此每次输入n个字符时,I/O缓冲区中实际存储了n+1个字符,即n个输入的字符和一个换行字符(\n)。而scanf("%c", &ch)仅仅读取第一个输入的字符,字后的字符(包括'\n')会驻留在缓冲区中。如果不清除缓冲区内容,则在程序运行到下一个scanf("%c", &ch)时,直接从缓冲区中读取字符,而不需要再次输入,直到缓冲区中的内容被清除。换句话说,只要I/O缓冲区中存在字符,scanf("%c", &ch)就会直接读取第一个字符,并且不会判断读入的字符是什么。
————————————————
原文链接:https://blog.csdn.net/alex_312/article/details/12852957
若对scanf("%c",&ch)输入了一个字符串,则再次遇到scanf("%ch",&ch)时会接着上次未读取结束出继续进行,而不用重新输入,本人将其命名为scanf()的连续性
printf()和scanf()的*修饰符
printf()中*可以代替修饰符中的数字
scnaf中的*可以抑制数值
例如
#include<stdio.h>
int main(void)
{
int width,num;
scanf("%*d,%*d,%d,%d",&width,&num);
printf("%*.*f",width,num,123.1234);
return 0;
}
交互模拟:
4,3,5,2 (加粗的表示输入)
123.12
此时width的值为5,num的值为2,printf()中的*分别代替了字符宽度还有小数位数
此处字段宽度不为5的原因是为了保证完整输出信息系统自动调整字段宽度