【发布时间】:2021-08-29 19:35:32
【问题描述】:
我正在尝试读取包含此格式 abc=1234 的行的文件。如何让 fscanf 忽略 = 并存储 str1="abc" 和 str2="1234"?
我试过了:
fscanf(fich1, "%[^=]=%[^=]" , palavra, num_char)
【问题讨论】:
-
palavra和num_char是如何声明的?
我正在尝试读取包含此格式 abc=1234 的行的文件。如何让 fscanf 忽略 = 并存储 str1="abc" 和 str2="1234"?
我试过了:
fscanf(fich1, "%[^=]=%[^=]" , palavra, num_char)
【问题讨论】:
palavra 和 num_char 是如何声明的?
我建议使用fgets 读取行,然后使用sscanf 解析它们。但是,如果您愿意,您可以对 fscanf 使用相同的原则。
#include <stdio.h>
int main(void) {
char buf[100];
char str1[100];
char str2[100];
if(! fgets(buf, sizeof buf, stdin)) return 1;
if(sscanf(buf, "%[^=]=%s", str1, str2) != 2) return 1;
puts(str1);
puts(str2);
}
那么%[^=]=%s 做了什么?首先%[^=] 读取所有内容,直到第一次出现= 并将其存储在str1 中。然后它读取= 并丢弃它。然后它读取一个字符串到str2。在这里您可以看到格式字符串的问题。 %[^=] 期望字符串以= 结尾,而您最后还有另一个字符串。这样你就可以成功读取字符串abc=1234=。
请注意,%[^=] 和 %s 对待空白的方式略有不同。因此,如果这是一个问题,您需要考虑到这一点。例如%[^=]=%[^\n]。
并且为了避免缓冲区溢出,您可能还想做%99[^=]=%99[^\n]。
【讨论】: