C语言特殊的输入输出(附C++输出格式)

结合个人情况且参考于网络


前言

在c语言的学习过程中,scanfprintf差不多是陪伴我们最久的一对“兄弟”,但其实这小小的两条语句,也可以玩出不一样的花样。

(本文章主要用于本人自我学习记录用) 


一、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里几个比较特殊的操作

可用于后续随时查询阅览

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值