结合个人情况且参考于网络
前言
在c语言的学习过程中,scanf与printf差不多是陪伴我们最久的一对“兄弟”,但其实这小小的两条语句,也可以玩出不一样的花样。
(本文章主要用于本人自我学习记录用)
一、scanf中 ‘ * ’ 的使用
格式字符串的一般形式为: %[*][输入数据宽度][长度]类型
‘ * ’ 的作用是跳过读入
#include<stdio.h>
int main()
{
int m=0,n=0;
scanf("%1d%*2d%3d",&m,&n); //输入 1234567
printf("%d %d\n",m,n); //输出 1 456
//对于字符也适用
char a='0',b='0';
scanf("%c%*c%c",&a,&b); //输入 abc
printf("%c %c\n",a,b); //输出 a c
//混合使用
int q=0,w=0;
char e='0';
scanf("%d%*c%d",&q,&w); //输入 231g78
printf("%d %d\n",q,w); //输出 231 78
return 0;
}
二、printf与scanf中%n的使用
在c语言中,%n是一个特殊的格式说明符,它不打印某些内容,它统计出现在 %n 之前的字符数,并将该值赋值给参数变量。
#include<stdio.h>
int main()
{
//在scanf中
int t=0,a=0,b=0;
scanf("%d & %d%n",&a,&b,&t); //输入 12 & 34
printf("%d",t); //输出 7
//在printf中
int k=0;
printf("hello %nworld\n",&k); //输出 hello world
printf("%d",k); 6
return 0;
}
三、%m.n的使用
1. %m.ns的相关应用
%ms: 输出字符串宽度为m,如果字符串实际宽度大于m,就用实际宽度。如果字符串的实际宽度小于m,则字符串右对齐,左补空格;
%-ms: 规则基本同上,不一样是字符串左对齐,右补空格;
%m.ns: 输出宽度占m,但是只取字符串中左端的n个字符。如果n小于m则右对齐,左补空格,如果n大于m,那么m失效,字符的输出宽度就是n。
%-m.ns:规则基本同上,不一样是如果n小于m那么需要左对齐,右补空格。
#include<stdio.h>
int main()
{
char *t="abcdefg"; //输出结果如下
printf("%6.3s\n",t); // abc(注意前面有三个空格)
printf("%-6.3s\n",t); //abc (注意后面有三个空格)
printf("%4.5s\n",t); //abcde
return 0;
}
2. %m.nf的相关应用
m是最小数据宽度,包含负号和小数点,n是小数点后的数字位数。当实际数值位数>m时,全部输出,<m时,右对齐,左补空格。(若是%-m.nf,左对齐,右补空格)
注意保留小数的四舍五入
#include<stdio.h>
int main()
{
double t=123.456; //输出结果如下
printf("%9.2f\n",t); // 123.46(注意前面有三个空格)
printf("%-9.2f\n",t); //123.46 (注意后面有三个空格)
printf("%4.5f\n",t); //123.45600
return 0;
}
3.%m.ne的相关应用
m为整个数据宽度(包含指数部分5位,即e+000),包含负号,n指小数点后的数字位。若数值位数>m,则全部输出,若<m,则右对齐,左补空格。(若是%-m.nf,左对齐,右补空格)
#include<stdio.h>
int main()
{
//输出结果如下
printf("%12.3e\n",3,1415926); // 1.482e-323
printf("%9.3e\n",3,1415926); //1.482e-323
printf("%-12.5e\n",3,1415926); //1.48220e-323
printf("%-9.10e\n",3,1415926); //1.4821969375e-323
return 0;
}
四、%[ ]的使用
常用:
(1)%[0-9]表示只读入’0’到’9’之间的字符
(2)%[a-zA-Z]表示只读入字母
(3)%[^a-z]就表示读入除小写字母之外的字符。 ^表示除XXX之外。
(4)"%n[^=]" 读入"="号前的至多n 个字符
(5)在符号前加^,比如 “%[^;]” 就是除了分号其他字符都可以输入,只忽略分号,可输入的字符是除去冒号的字符集补集。
'-'是范围连接符,当然也可以直接列出需要读入的字符。
#include <stdio.h>
int f()
{
scanf("%*[^0-9]"); //只读入0-9 的字符
return 1;
}
int main()
{
int n;
while(f()&&~scanf("%d",&n)) //再读入f()处理后的字符给n
printf("%d\n",n);
return 0;
}
/*
输入: 1234fgh567kl89
输出: 1234
567
89
*/
附:c++输入输出格式总结
int main() { int m; double a; bool v; // 交换1与true noboolalpha反义 cin >> boolalpha >> v; // oct 八进制,hex 十六进制,dec 十进制 cin >> oct >> m; cin >> a; // showbase可以表示是几进制输出 cout << v << endl << showbase << hex << m << endl; cout.precision(5); // 以几个数字格式输出 cout << a << endl; // 将上面precision变成小数点后xx位 cout << fixed << a << endl; // 以科学计数法输出 cout << scientific << a << endl; // 右对齐,占6列(setw只对紧跟其后的有作用) ,setfill可控制填充 cout << right << setfill('s') << setw(6) << m << endl; cout.width(6); // 宽度为6 cout << m << endl; // 输出时带'+''-'号,noshowpos取消 cout << showpos << m; return 0; }
本篇文章浅要列举scanf与printf里几个比较特殊的操作
可用于后续随时查询阅览