陆陆续续, 总是不停的被人问 c 里面用 %[] 输入字符串的问题, google & baidu 了下,
奇怪的发现网上几乎没有与其相关的详细说明, 根据以往使用经验, 对其小节一下 :)
c里面常见的输入字符串的东西, 如: gets(), scanf("%s",), (c++里面的getline()) 等, 随便一个会c的人应该都很熟悉了, 但这些输入不是以 空格/tab 为分隔符,就是以回车为分隔符( 大多数情况下,这正式我们想要的), 不过, 如果要处理的字符串以其它字符分隔 怎么办? 比如 a&bb&ccc, 我们需要一个一个录入以 '&' 为分隔符的字符串, 如果还用这些函数, 毫无疑问, 我们必需添加额外的手工code 来把想要的字符串分隔出来( 一次读入一行,或者一个字符一个字符的读入,然后做相应处理). 另外,如果我们想一次读入多行,用上述这些函数也是比较费力的.
怎么办? 有简单方法吗? 当然有, 一个类似这样的东西:
char str[10];
scanf("%[a-z0-9]",str); //输入所有a,b,c..z, 0,1,9. 直到遇到其它字符.
scanf("%[^/n]",str); // 输入所有字符直到遇到 回车符'/n'为止
scanf("%[^a]",str); // 同上, 遇到字符a时停下来.
直观上看上去, %[] 里面的语法是非常简单的, ^ 符号之前的为要录入的字符( 也就是前门没有^ 符号的,这种情况一般不用写出 ^ ) ,遇到其它字符就会停止读入.
^ 符号之后的为 停止字符, 即遇到这些字符中的任一个(没错, ^后门可以跟多个字符 :) )就会停止读入. 当然, 一般来讲, ^之前和之后是不能同时存在东西的 ---同时存在本身就说不通:).
在[] 内表明字符时, 可以挨着写, 如"acd" 表示字符 'a' 'c' 'd'. 也可以简写 如0-9表示0123456789 a-z表示abc...z .
另外,需要格外注意的是 %[] 是不会录入停止字符的, 也不会忽略任何字符( 空格,回车等), 可以利用^实现交替读入特定字符分隔的字符串,如对于如下字符串:
1000000AAAAAA2212211221AADSFDSF212211221DFSAADSF23212112
如果想录入以大写字母字符串分隔的数字, 可以用类似如下的code:
scanf("%[0-9]",str);// 录入所有数字,非数字则停下来, 第一次1000000
scanf("%[^0-9]",str); // 录入所有非数字,遇到数字停下来,第一次AAAAAA
自己加个循环就完啦:)
再强调一次, %[] 这种输入是不会忽略任何字符的, 即便是回车( 尽管其它输入函数经常忽略掉他), 停止字符是不会被读入的.
于是我们甚至可以用 %[] 来输入符合条件的 多行, 如对于文本:
aaaa
bbbb
cccc
dddd
E
用类似下面的code:
scanf("%[^E]",str)
可以一次性录入
aaaa
bbbb
cccc
dddd
这有个回车
很明显,包括回车也被读了进来( 当然, 停止字符 E 是不会被读入的 )
还要再补充一下, 经测试, 这种方法读入比 手工code, 一个字符一个字符处理, 读入要快很多很多.
===================================
一点经验之谈, 没有查阅相关资料, 懂的只是皮毛:)
欢迎大虾 指正 ^_^