%[^ \ n]的用法

时间:2010-04-28 22:03:31

标签: c

A[50][5000];
for(i=0;i<50;++i)
scanf("%[\n]",A[i]);

%[^\n]  
 usage and meaning of it

and can i use that struct like

       %[\t]
       %[\a]

3 个答案:

答案 0 :(得分:2)

scanf()的{​​{1}}转换说明符启动了所谓的“扫描集”。它与看起来相同的正则表达式构造有一些相似之处(但它仍然完全不同)以下是标准所说的内容:

  

匹配一组预期字符(扫描集)中的非空字符序列。

     

...

     

转换说明符包括格式字符串中的所有后续字符,包括匹配的右括号(])。括号(扫描列表)之间的字符组成扫描集,除非左括号后面的字符是抑扬符(^),在这种情况下,扫描集包含在旋转和右括号之间的扫描列表中不出现的所有字符。如果转换说明符以[]或[^]开头,则右括号字符位于扫描列表中,下一个右括号字符是结束规范的匹配右括号;否则第一个右括号字符是结束规范的字符。如果 - 字符在扫描列表中并且不是第一个字符,也不是第一个字符是^的第二个字符,也不是最后一个字符,则行为是实现定义的。

因此,"%["转化scanf()将与换行符匹配,而"%[\n]"将匹配所有字符,直到换行符。

以下是P.J. Plauger关于“标准C库”中扫描集的说法:

  

扫描集的行为与"%[^\n]"转换说明符非常相似。它在s指向的char数组中存储最多w个字符(默认为输入的其余部分)。它总是在任何输入后存储空字符。它跳过前导空格。它还允许您指定要考虑作为字段一部分的字符。您可以指定匹配的所有字符,如ptr中的匹配任意十六进制数字序列。或者您可以指定所有不匹配的字符,例如%[0123456789abcdefABCDEF]中匹配除数字以外的任何字符。

     

如果要在指定的字符集中包含右括号(%[^0123456789]),请在开始](或[)后立即写入,如{{ 1}}扫描方括号。您不能在指定的字符集中包含空字符。某些实现可能允许您使用减号([^)指定一系列字符。例如,十六进制数字列表可以写为%[][],在某些情况下甚至可以写为-。但请注意,这种用法并不普遍。在您希望保持最大可移植性的程序中避免使用它。

答案 1 :(得分:1)

是的,它漂亮非常像正则表达式中的一个集合 - 您可以指定一组要接受的字符,或者一组字符来结束扫描,所以“%[^ \ r \ n \ t]“会读到它,直到遇到空格,回车,换行符或制表符。与RE一样,前导“^”表示“不” - 您可以省略它以指定将被接受的字符而不是将结束转换的字符。对于大多数编译器(尽管技术上不需要),您可以指定范围,例如“%[az]”以指定任何小写字母(在这种情况下,“ - ”不是第一个或最后一个字符,行为是实现定义的。)

虽然没有被广泛使用(或者甚至已知),但这种转换几乎永远是C的一部分,并且在C89 / 90中得到了支持。

答案 2 :(得分:0)

将一个字符串复制到一个换行符,从标准输入到A.的元素i,如同所写,这几乎就像gets()。