假设我有一个文件dog.txt
The quick brown fox jumps over the lazy dog.
我可以像这样从文件中读取
# include <stdio.h>
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:]
?
不,没有便携式方法可以做到这一点。某些实现允许您使用字符范围,例如%[A-Z]
,但是 C 标准不保证这一点。 C99 §7.19.6.2/12 是这样说的[
转换说明符(添加强调):
转换说明符包括所有后续字符format
字符串,直到并包括匹配的右括号 (]
)。括号之间的字符(scanlist) 组成扫描集,除非左括号后面的字符是扬抑符 (^
),在这种情况下,扫描集包含未出现在扫描列表中扬抑符和右括号之间的所有字符。如果转换说明符开头为[]
or [^]
,右括号字符在扫描列表中,下一个右括号字符是结束规范的匹配右括号;否则第一个右括号字符是结束规范的字符。If a -
字符在扫描列表中,并且不是第一个,也不是第二个,其中第一个字符是^
,也不是最后一个字符,该行为是实现定义的。
The POSIX.1-2008 说明 http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html具有几乎相同的措辞(甚至在意外冲突的情况下遵循 ISO C 标准),因此在使用 POSIX 系统时,在这种情况下没有额外的保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)