关于 scanf(“%[^\n]%*c“,str);

转载:https://blog.csdn.net/qq_30007603/article/details/81164232

要求读入一行字符串,而这串字符里面可能有空格、制表符等空白字符

如果直接用%s是不可以的,于是有些人就想到用gets()。
但由于gets很难控制,故而一般不推荐使用,所以用%[^\n]就可以很好的解决这个问题了。
^表示"非"即读入其后面的字符就结束读入。

#include <stdio.h>
int main()
{
	int str[100];
	while(~scanf("%[^\n]%*c",str)) puts(str);   //%*c的作用是读入\n,否则后面读入的将一直是\n
	return 0;
}

经过上述代码处理,便可顺利地循环读取带有空格的字符串。

另外地,所有对%s起作用的控制都可以用%[ ]:

%[0-9]表示只读入'0''9'之间的字符
%[a-zA-Z]表示只读入字母
%[^a-z]就表示读入小写字母之外的字符。
"%n[^=]" 读入"="号前的至多n 个字符
'-'是范围连接符,当然也可以直接列出需要读入的字符。

%c 一个单一的字符 
%d 一个十进制整数 
%i 一个整数 
%e, %f, %g 一个浮点数 
%o 一个八进制数 
%s 一个字符串 
%x 一个十六进制数 
%p 一个指针 
%n 一个等于读取字符数量的整数 
%u 一个无符号整数 
%[] 一个字符集 
%% 一个精度符号
//Example 1.0
//从键盘输入的"1235ab86"中读取1235、86给n。
#include <stdio.h>
int skip(){
    scanf("%*[^0-9]");   //跳过读入 非0-9 的字符 
    return 1;
}
int main()
{
    int n;
    while(skip()&&~scanf("%d",&n))  //再读入skip处理后的字符给n
		printf("%d\n",n);
	return 0;
}
//输出为:1235
        //86


//根据第一例,也可使用跳过字符的方式获取
#include <stdio.h>
int str[100];
int skip(){
	scanf("%*[^1-9][^,]");    //跳过读入非1-9和非,的字符
	return 1;
}
int main()
{
	while(skip()&&~scanf("%s",&str)){  //scanf再次读入经skip处理后的字符串
		printf("%s",str);              //这样可以达到删去不想要的字符的目的 		
    //也可以在跳过读取后,scanf输入给int变量n而不是字符数组str,修改相应输入输出可灵活变换 
	} 
	return 0;
}

//Example 2.0
//整数部分的高位有多余的0时,过滤0以获取不含0的整数 
#include <stdio.h>
int str[100];
int fun(){
	scanf("%[^1-9]",&str);    //读入字符,如果遇到非1-9的字符,停止
	return 1;
}
int main()
{
	while(fun()&&~scanf("%s",&str)){  //scanf再次读入经fun处理后的字符串,会覆盖fun读入的字符
		puts(str);                    //这样可以达到删去不想要的字符的目的 		
	} 
	return 0;
}
//输入0000001234,56
//输出1234,56
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值