scanf之间的区别("%79 [^ \n]",行); vs scanf("%79 [^ \n] \n",行)vs scanf("%79 [^ \n] s",行)

div*_*ero 3 c scanf

我正在用c编写一个程序来读取文件的内容.代码如下:

   #include<stdio.h>
   void main()
   {
   char line[90];
   while(scanf("%79[^\n]\n",line)==1) 
   printf("%s",line);
   }
Run Code Online (Sandbox Code Playgroud)

上面的代码读取文件内容并将其显示在屏幕上.

while(scanf("%79[^\n]",line)==1) and while(scanf("%79[^\n]s",line)==1) or while(scanf("%79[^\n]s\n",line)==1) 
Run Code Online (Sandbox Code Playgroud)

不起作用.(它们只显示第一行)

谁能解释一下?

R S*_*ahu 5

格式"%79[^\n]"表示最多不超过79个字符的所有字符'\n'.

当你使用时,

scanf("%79[^\n]s",line)
Run Code Online (Sandbox Code Playgroud)

返回值不应该是1,因为s格式说明符s在读完所有不是的字符后需要一个文字'\n'.换句话说,scanf报告失败.

当你使用时,

scanf("%79[^\n]\n",line)
Run Code Online (Sandbox Code Playgroud)

它成功了,因为它最终找到了一个文字'\n'.

和...之间的不同

scanf("%79[^\n]",line)
Run Code Online (Sandbox Code Playgroud)

scanf("%79[^\n]\n",line)
Run Code Online (Sandbox Code Playgroud)

'\n'在第一种情况下留在输入流中,而在第二种情况下消耗它.在第二种情况下,不仅'\n'消耗了,而且任何从空格开始的空格序列也'\n'被消耗了(感谢@MattMcNabb进行了额外的澄清).

如果你只想scanf消费'\n',请使用:

scanf("%79[^\n]%*c",line)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,方括号外的`\n`匹配*任何空格*的序列,而不仅仅是一个换行符.此版本还将占用以下行中的任何前导空格. (2认同)