Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在字数未知的情况下使用fscanf字符串?_C_Scanf - Fatal编程技术网

如何在字数未知的情况下使用fscanf字符串?

如何在字数未知的情况下使用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:读一行 现在

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

代码主题名称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:读一行


现在,
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