簡體   English   中英

如何 fscanf 字數未知的字符串?

[英]How to fscanf string with unknown number of words?

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

代碼subject_name ects

其中codeects是整數,而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

第二步:由於subject_nameects可以是一個數字,所以讓代碼先尋找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有希望, codesubject_name可以用用戶代碼解析, sscanf()strtol()等。把它留給 OP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM