C语言_scanf

控制输入输出长度

printf() 中可以指定最小输出宽度吗,就是在格式控制符的中间加上一个数字,例如,%10d表示输出的整数至少占用 10 个字符的位置:

  • 如果整数的宽度不足 10,那么在左边以空格补齐;
  • 如果整数的宽度超过了 10,那么以整数本身的宽度来输出,10 不再起作用。

scanf() 也有类似的用法,也可以在格式控制符的中间加一个数字,用来表示读取数据的最大长度,例如:

  • %2d表示最多读取两位整数;
  • %10s表示读取的字符串的最大长度为 10,或者说,最多读取 10 个字符。

匹配特定的字符

%s 控制符会匹配除空白符以外的所有字符,它有两个缺点:

  1. %s 不能读取特定的字符,比如只想读取小写字母,或者十进制数字等,%s 就无能为力;
  2. %s 读取到的字符串中不能包含空白符,有些情况会比较尴尬,例如,无法将多个单词存放到一个字符串中,因为单词之间就是以空格为分隔的,%s 遇到空格就读取结束了。

(空白符 通常指 空格符' ', 回车符'\r', 换行符 '\n', 制表符 '\t')  

scanf() 的一种字符匹配方式,就是%[xxx],[ ]包围起来的是需要读取的字符集合。例如,%[abcd]表示只读取字符abcd,遇到其它的字符就读取结束;注意,这里并不强调字符的顺序,只要字符在 abcd 范围内都可以匹配成功,所以你可以输入 abcd、dcba、ccdc、bdcca 等。

使用连接符
为了简化字符集合的写法,scanf() 支持使用连字符-来表示一个范围内的字符,例如 %[a-z]、%[0-9] 等。

连字符左边的字符对应一个 ASCII 码,连字符右边的字符也对应一个 ASCII 码,位于这两个 ASCII 码范围以内的字符就是要读取的字符。注意,连字符左边的 ASCII 码要小于右边的,如果反过来,那么它的行为是未定义的。

%[a-zA-Z]表示读取大写字母和小写字母,也即所有英文字母;
%[a-z-A-Z0-9]表示读取所有的英文字母和十进制数字;
%[0-9a-f]表示读取十六进制数字。
%[a-zA-Z]表示读取大写字母和小写字母,也即所有英文字母;
%[a-z-A-Z0-9]表示读取所有的英文字母和十进制数字;
%[0-9a-f]表示读取十六进制数字。

 不匹配某些字符

scanf() 允许我们在%[ ]中直接指定某些不能匹配的字符,具体方法就是在不匹配的字符前面加上^

%[^\n]表示匹配除换行符以外的所有字符,遇到换行符就停止读取;
%[^0-9]表示匹配除十进制数字以外的所有字符,遇到十进制数字就停止读取。

scanf("%[^\n]", str); 的作用是读取一行字符串,和 gets() 的功能一模一样。你看,scanf() 也能读取带空格的字符串呀,谁说 scanf() 不能完全取代 gets(),这明显是错误的说法。

另外,scanf() 还可以指定字符串的最大长度,指定字符串中不能包含哪些字符,这是 gets() 不具备的功能。

例如,读取一行不能包含十进制数字的字符串,并且长度不能超过 30:

scanf("%30[^0-9\n]", str);

代码段使用了多个 scanf() 函数连续读取数据,为了避免受到缓冲区中遗留数据的影响,每次读取结束我们都使用scanf("%*[^\n]"); scanf("%*c");来清空缓冲区。 

 丢弃读取到的字符

在前面的代码中,每个格式控制符都要对应一个变量,把读取到的数据放入对应的变量中。其实你也可以不这样做,scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*,例如:

%*d表示读取一个整数并丢弃;
%*[a-z]表示读取小写字母并丢弃;
%*[^\n]表示将换行符以外的字符全部丢弃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值