带有字符类的fscanf
说我有一个文件dog.txt
The quick brown fox jumps over the lazy dog.
我可以像这样从文件中读取
# include int main(){ char str[10]; FILE *fp; fp = fopen("dog.txt", "r"); fscanf(fp, "%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]", str); printf("%s\n", str); return 0; }
程序将输出T
但是,我可以使用POSIX字符类,而不是列出所有字母,如[:upper:]
?
不,没有可移植的方式来做到这一点。 某些实现允许您使用%[AZ]
等字符范围,但C标准无法保证这一点。 C99§7.19.6.2/ 12说明了[
转换说明符(强调添加):
转换说明符包括
format
字符串中的所有后续字符,包括匹配的右括号(]
)。 括号( 扫描列表 )之间的字符组成扫描集,除非左括号后面的字符是抑扬符(^
),在这种情况下,扫描集包含旋转和右括号之间的扫描列表中未出现的所有字符。 如果转换说明符以[]
或[^]
开头,则右括号字符位于扫描列表中,下一个右括号字符是结束规范的匹配右括号; 否则第一个右括号字符是结束规范的字符。 如果-
字符在扫描列表中并且不是第一个字符,也不是第一个字符是^
的第二个字符,也不是最后一个字符,则行为是实现定义的。
POSIX.1-2008描述具有几乎相同的措辞(在意外冲突的情况下甚至遵循ISO C标准),因此在使用POSIX系统时没有额外的保证。
不,你不能。 这是你可以用[]
做的:
转换规范包括格式字符串中的所有后续字节,包括匹配的
(’ ]
‘)。 方括号( 扫描列表 )之间的字节构成扫描集,除非之后的字节是 (’ ^
‘),在这种情况下,扫描集包含所有未出现的字节和之间的扫描列表。 如果转换规范以“ []
”或“[^]
”开头,则包含在扫描列表中,下一个 是匹配的 结束转换规范; 否则,第一个 是结束转换规范的那个。 如果’ -
‘在扫描列表中并且不是第一个字符,也不是第一个字符是’^
‘的第二个字符,也不是最后一个字符,则行为是实现定义的。
( 扫描的POSIX标准 .C标准有类似的措辞,请参阅Adam Rosenfield的答案。)
因此,根据实现,您可能能够执行fscanf(fp, "%[AZ]", str)
,但不能保证它可以在任何POSIX系统上运行。 无论如何, [:upper:]
与[:epru]
相同。
试试这个:
fscanf(fp, "%[AZ]", str);