我已经有了一些使用fscanf()
读取文本文件的代码,现在我需要对其进行修改,以便以前无空格的字段需要允许空格。文本文件基本上采用以下形式:
标题:数据
标题:数据
等...
基本使用fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);
进行解析,读取DATA字段并忽略标题,但现在某些数据字段需要允许空格。我仍然需要在它之后立即忽略标题和空格,但是然后读取包括空格在内的其余部分。
无论如何使用sscanf()
函数执行此操作?
如果没有,我可以对代码进行最小的改变以正确处理空格?
更新:我编辑了用fgets()+ sscanf()替换fscanf()的问题,这是我的代码实际使用的。当我第一次写这个问题时,我并不认为它是相关的,这就是我将它简化为fscanf()的原因。
答案 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编程,这本书非常值得拥有。