c - 如何使用未知数量的单词 fscanf 字符串?
问题描述
我有一个格式如下的文本文件:
代码主题名称等
其中code和ects是整数,subject_name是一个字符串,可以是多个单词,有时还包含一个数字。
我试过fscanf(f, "%d %s %d", &code, subject_name, &ects);
哪个不起作用,因为字符串中有空格。
"%d %[^\n] %d"
也不会工作,因为字符串会吞噬ects。
这样做的正确方法是什么?
解决方案
第一步:读一行
#define LINE_MAX_EXPECTED_SIZE 100
char buf[LINE_MAX_EXPECTED_SIZE + 2];// Let code read lines that are too long
if (fgets(buf, sizeof buf, f)) {
buf[strcspn(buf, "\n\r")] = '\0'; // lop off potential end-of-line
if (strlen(buf) >= LINE_MAX_EXPECTED_SIZE || buf[0] == '\0') {
fprintf(stderr, "Line too long/short. <%s>\n", buf);
exit(EXIT_FAILURE);
}
...
好的,现在我们已读取该行并将其保存为string。
步骤 2:既然subject_name
andects
可以是一个数字,那么让代码ects
先查找它,因为它是一个且只有一个数字。
// Start at end
char *end = strlen(buf) - 1;
if (!isdigit((unsigned char) *end)) {
fprintf(stderr, "No number at end. <%s>\n", buf);
exit(EXIT_FAILURE);
}
while (end > buf && isdigit((unsigned char) * --end)) {
;
}
if (end > buf && (*end == '-' || *end == '+')) {
end--;
}
ects = atoi(end + 1); // or better strtol()
end[1] = '\0'; // lop off ects
现在buf
有,希望,code
并且subject_name
可以用用户代码解析sscanf()
,, strtol()
, 等。把它留给 OP。