我需要解释fscanf参数

您好我需要更好地解释fscanf参数。 我有以下文本文件

this is line 1 this is line 2 this is line 3 ... 

读出我做的

 for(int i=0;i<2;++i){ test[255]; fscanf(fp,"%[\n]",test); printf("%s\n",test); } now I get: this is line 1 this is line 1 with "%[^\n]\n" I get this is line 1 this is line 2 

现在我根据我的理解将我的陈述分开:%表示读取未格式化(%s会给我一个字符串%c单个字符…)[^ \ n]直到你得到的东西在这种情况下不匹配新队

你能解释一下方括号的function和终止吗? 我阅读了官方解释,但没有完全理解。

扩展1:我的问题。 我知道有更多易于使用的选项来实现我的目标。 但我只是想了解fscanf的语法。

扩展2:当我理解正确的时候

 fscanf(fp,"%[^\n]%*c",test) 

读取直到换行并跳过下一个换行符。 遵循此逻辑,%[^ \ n]将是除换行符之外的每个字符。 我可以写

 for(int i=0;i<2;++i){ test[255]; fscanf(fp,"%[az]",test); printf("%s\n",test); } 

我希望得到

 this is 

但我明白了

 ٷ  ٷ  

扩展3问题不重复scanf()将新行char留在缓冲区中,因为我想读取一个完整的行

使用scanf系列函数可以解释输入流中剩余的内容。 格式说明符%[^\n]使用字符类 (不是'\n' )来读取换行符 – 允许使用空格输入字符串。 字符类 (例如[...] )匹配括号内的字符, '^'作为字符类中的第一个字符反转匹配 。 转换完成后, '\n'行结束将保留在输入缓冲区中。

由于字符串转换在遇到换行符时结束,而不删除保留在输入缓冲区中的'\n' ,因此下一次读取尝试终止而不读取任何字符(输入失败), test的值保持不变(保持第一行的值)所以当你再次打印它时,你会得到同样的东西。

来自man 3 scanf

 s Matches a sequence of non-white-space characters; ... The input string stops at white space or at the maximum field width, whichever occurs first. [ Matches a nonempty sequence of characters from the specified set of accepted characters; ... The usual skip of leading white space is suppressed. 

当您更改格式字符串以包含换行符( "%[^\n]\n" )时,您只需删除剩余的换行符。 因此,您下次尝试阅读时会看到第二行的第一个字符并且读取正确。 您还可以使用( "%[^\n]%*c" )使用分配抑制运算符'*'来读取和丢弃字符类后面的下一个字符。

这个陷阱(没有考虑保留在输入缓冲区中的字符)是鼓励新C程序员使用fgets (或POSIX getline )进行面向行的输入的主要原因之一,因为这两个函数都读取(包括)他们填充的缓冲区中的换行符 – 消除了将其留下未读的可能性 – 只是等待下次读取时出现问题。