2

假设我有一个文件 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:]

4

3 回答 3

2

不,你不能。这是你可以做的[]

转换规范包括格式字符串中的所有后续字节,直到并包括匹配的 <right-square-bracket> (' ]')。方括号(scanlist)之间的字节组成了扫描集,除非 <left-square-bracket> 之后的字节是 <circumflex> (' ^'),在这种情况下,扫描集包含所有未出现在和 <right-square-bracket> 之间的扫描列表。如果转换规范以 " []" 或 " [^]" 开头,则 <right-square-bracket> 包含在扫描列表中,并且下一个 <right-square-bracket> 是结束转换规范的匹配 <right-square-bracket> ; 否则,第一个 < right-square-bracket> 是结束转换规范的那个。如果一个 '-' 在扫描列表中并且不是第一个字符,也不是第一个字符是 ' ^' 的第二个字符,也不是最后一个字符,行为是实现定义的。

POSIX 标准scanf。C 标准有类似的措辞,请参阅 Adam Rosenfield 的回答。)

因此,根据实现,您可能可以这样做fscanf(fp, "%[A-Z]", str),但不能保证这将适用于任何 POSIX 系统。在任何情况下,[:upper:]都与 相同[:epru]

于 2012-10-28T23:29:01.607 回答
2

不,没有便携的方法可以做到这一点。一些实现允许您使用诸如 之类的字符范围%[A-Z],但这不是 C 标准所保证的。C99 §7.19.6.2/12 说明了[转换说明符(添加了重点):

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

POSIX.1-2008 描述具有几乎相同的措辞(甚至在意外冲突的情况下遵循 ISO C 标准),因此在使用 POSIX 系统时在这种情况下没有额外的保证。

于 2012-10-28T23:29:44.150 回答
0

试试这个:

fscanf(fp, "%[A-Z]", str);
于 2012-10-28T23:30:00.247 回答