fscanf()可以读取空格吗?

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

标题:数据
标题:数据
等等…

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

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

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

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

如果你不能使用fgets()使用%[转换说明符(使用“exclude option”):

 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); 

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

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

最简单的事情是发出一个

 fscanf("%*s"); 

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

 fgets(str, stringSize, filePtr); 

如果您坚持使用scanf ,并假设您想将换行符作为终止符,则可以执行以下操作:

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

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

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

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

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

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

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

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

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

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

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