关于c里面 用 %[] 输入字符串的问题 【摘自旧博】

陆陆续续, 总是不停的被人问 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, 一个字符一个字符处理, 读入要快很多很多.
===================================
一点经验之谈, 没有查阅相关资料, 懂的只是皮毛:)
欢迎大虾 指正 ^_^

 

 发表于: 2007-09-18,修改于: 2007-09-18 12:03
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值