fscanf()可以读取空格吗?

时间:2009-12-23 00:25:18

标签: c string file-io

我已经有了一些使用fscanf()读取文本文件的代码,现在我需要对其进行修改,以便以前无空格的字段需要允许空格。文本文件基本上采用以下形式:

  标题:数据
  标题:数据
  等...

基本使用fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);进行解析,读取DATA字段并忽略标题,但现在某些数据字段需要允许空格。我仍然需要在它之后立即忽略标题和空格,但是然后读取包括空格在内的其余部分。

无论如何使用sscanf()函数执行此操作?

如果没有,我可以对代码进行最小的改变以正确处理空格?

更新:我编辑了用fgets()+ sscanf()替换fscanf()的问题,这是我的代码实际使用的。当我第一次写这个问题时,我并不认为它是相关的,这就是我将它简化为fscanf()的原因。

6 个答案:

答案 0 :(得分:13)

如果您无法使用fgets(),请使用%[转换说明符(使用“排除选项”):

char buf[100];
fscanf(stdin, "%*s %99[^\n]", buf);
printf("value read: [%s]\n", buf);

fgets()更好。


修改:fgets() + sscanf()

的版本
char buf[100], title[100];
fgets(buf, sizeof buf, stdin); /* expect string like "title: TITLE WITH SPACES" */
sscanf(buf, "%*s %99[^\n]", title);

答案 1 :(得分:3)

我强烈建议您停止使用fscanf()并开始使用fgets()(读取整行),然后解析已读取的行。

这将使您在解析非精确格式的输入方面拥有更大的自由度。

答案 2 :(得分:3)

最简单的方法是发出

fscanf("%*s");

丢弃第一部分,然后只需调用fgets:

fgets(str, stringSize, filePtr);

答案 3 :(得分:3)

如果你坚持使用scanf,并假设你想让换行符作为终结符,你可以这样做:

scanf("%*s %[^\n]", str);

但是,请注意,完全按照书面形式使用上述内容是一个坏主意,因为没有什么可以防止str溢出(因为scanf不知道它的大小)。当然,您可以设置预定义的最大大小,并指定该大小,但是您的程序可能无法在某些有效输入上正常工作。

如果输入格式定义的行的大小不受限制,那么您唯一可行的选择是使用fgetc按字符读取数据char,定期重新分配缓冲区。如果你这样做,那么修改它以删除所有读取字符,直到第一个空格是相当微不足道的。

答案 4 :(得分:2)

fscanf中的%s说明符会跳过输入上的任何空格,然后读取一串非空白字符,最多不包括下一个空白字符。

如果您想阅读换行符,可以使用%[^\n]作为说明符。另外,格式字符串中的''将跳过输入上的空格。所以,如果你使用

fscanf("%*s %[^\n]", &str);

它将读取第一个空白行的第一件事(在你的情况下为“title:”),扔掉它,然后将读取空白字符并将它们扔掉,然后将读取所有字符直到newline into str,听起来像你想要的。

小心str不会溢出 - 你可能想要使用

fscanf("%*s %100[^\n]", &str)

限制你将读取的最大字符串长度(100个字符,不包括终止NUL)。

答案 5 :(得分:1)

你正在遇到*scanf家庭有利的限制。通过相当少的更改,您可以尝试使用Dave Hanson的C Interfaces and Implementations中的字符串扫描模块。这个东西是编程语言Icon的改进,这是一种非常简单和强大的字符串处理语言,Hanson和其他人在亚利桑那州工作。与sscanf的偏离不会太严重,它比正则表达式更简单,更易于使用,并且更强大。唯一的缺点是代码在没有书的情况下有点难以理解 - 但如果你做了很多C编程,这本书非常值得拥有。