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]
答案 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()。