首页 > 解决方案 > 如何使用未知数量的单词 fscanf 字符串?

问题描述

我有一个格式如下的文本文件:

代码主题名称等

其中codeects是整数,subject_name是一个字符串,可以是多个单词,有时还包含一个数字。

我试过fscanf(f, "%d %s %d", &code, subject_name, &ects);哪个不起作用,因为字符串中有空格。

"%d %[^\n] %d"也不会工作,因为字符串会吞噬ects

这样做的正确方法是什么?

标签: cscanf

解决方案


第一步:读一行

#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_nameandects可以是一个数字,那么让代码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。


推荐阅读