C fscanf 复杂格式

C fscanf complex format

我正在尝试从 C 文件中读取此文本。假设这是文件 Input.txt

This is a description which can be up to 1024 characters long
First
Second
Thrid   Option  This is a description for third
Fourth

我想读4个字 第一, 第二, 第三, 第四,其余的将被丢弃。我有这个问题的解决方案,但我不明白它为什么有效:

char string[1024];
char words[4][256]; 
FILE *in = fopen("Input.txt", "r");

// Catch first line
fgets(string, 1024, in);

for(int i = 0; i < 4; i++){
    fscanf(in, "%255s[^\n]\n", words[i]);
    fscanf(in, "%*[^\n]\n");
}

输入文件应为特殊格式。

如果能解释格式字符串的不同组成部分、它们的工作原理以及整个解决方案为何有效,我将不胜感激。

(我也没有找到关于fscanf格式如何工作的任何具体信息,如果有人能给我参考,我会很高兴)

"and why this whole solution works" IMO,在一般情况下,它不会。

2 fscanf(in, ... 格式中的第二个 '\n' 使它成为一个弱解决方案。 '\n' 将扫描任意数量的换行符以及任何白色 space。最好继续使用 fgets(string, ...) 然后 sscanf(string, ...)

"%255s[^\n]\n""%255s" 之后查找 [。奇怪的代码。


相反

char string[1024+1+1];  // increase for the \n and the [=10=]
char words[4][256]; 
FILE *in = fopen("Input.txt", "r");

// Catch first line
// fgets(string, 1024, in);
fgets(string, sizeof string, in);

// "%255s" 
// scan over yet do not save leading white-space
// scan and save up to 255 non-white-space characters.
// Append a null character to form a string
for(int i = 0; i < 4 &&  fgets(string, sizeof string, in); i++ ){
    if (sscanf(string, "%255s", words[i]) != 1) {
      words[i][0] = '[=10=]'; // If line was all white-sapce
    }
    puts(words[i]);
}