如何在字数未知的情况下使用fscanf字符串?
我有一个如下格式的文本文件: 代码主题名称ects 其中code和ECT是整数,subject_name是一个字符串,可以是多个单词,有时还包含一个数字 我尝试了如何在字数未知的情况下使用fscanf字符串?,c,scanf,C,Scanf,我有一个如下格式的文本文件: 代码主题名称ects 其中code和ECT是整数,subject_name是一个字符串,可以是多个单词,有时还包含一个数字 我尝试了fscanf(f、%d%s%d)、&code、主题名称和ects)无效,因为字符串中有空格 %d%[^\n]%d“也无法工作,因为字符串会吞噬ECT 正确的方法是什么?步骤1:读一行 现在,buf希望有code和subject\u name可以用用户代码解析,sscanf(),strtol(),等等。把这些留给OP.步骤1:读一行 现在
fscanf(f、%d%s%d)、&code、主题名称和ects)代码>无效,因为字符串中有空格
%d%[^\n]%d“
也无法工作,因为字符串会吞噬ECT
正确的方法是什么?步骤1:读一行
现在,buf
希望有code
和subject\u name
可以用用户代码解析,sscanf()
,strtol()
,等等。把这些留给OP.步骤1:读一行
现在,buf
希望有code
和subject\u name
可以用用户代码解析,sscanf()
,strtol()
,等等。把它留给OP.你需要阅读整行,然后解析它。编写解析器是最常见的程序员任务之一。你能告诉我ects何时启动吗?如果主题名称包含数字、空格和不同数量的单词,则很难判断ects何时开始。请注意,“code subject_name ects”`是文件中的一行。所以读一行,你需要读整行,然后解析它。编写解析器是最常见的程序员任务之一。你能告诉我ects何时启动吗?如果主题名称包含数字、空格和不同数量的单词,则很难判断ects何时开始。请注意,“code subject_name 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);
}
...
// 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