如何从\n分隔文件中读取字符串

mat*_*_nz 6 c scanf stdio fgets

我正在尝试读取返回分隔文件.充满了短语.

我正在尝试将每个短语放入一个字符串中.

问题是当我尝试用文件读取时

fscanf(file,"%50s\n",string);
Run Code Online (Sandbox Code Playgroud)

该字符串只包含一个单词.当它与空间碰撞时,它会停止读取字符串

N 1*_*1.1 5

fscanf(file,"%50[^\n]\n",string);
Run Code Online (Sandbox Code Playgroud)
  1. 除了\n将被消耗的每个字符[^\n]

  2. 将消耗最多0f 50个字符(确保字符串至少有51个空格)

  3. ..\n",string这确保了\n它也被消耗,以便下一个调用不仅返回空字符串.


Nat*_* S. 2

可以修改 fscanf 以读取过去的空格。细节有点复杂。这是手册页关于 %[...] 的内容

匹配指定的接受字符集中的非空字符序列;next 指针必须是指向 char 的指针,并且必须有足够的空间容纳字符串中的所有字符以及终止 NUL 字符。通常跳过前导空白的现象被抑制。该字符串由特定集合中(或不包含)的字符组成;该集合由左括号 [ 字符和右括号 ] 字符之间的字符定义。如果开括号后的第一个字符是扬抑符 ^,则该集将排除这些字符。要在集合中包含右括号,请将其作为左括号或扬抑符之后的第一个字符;任何其他位置都将结束该组。连字符 - 也很特殊;当放置在其他两个字符之间时,它将所有中间字符添加到集合中。要包含连字符,请将其作为最后一个右括号之前的最后一个字符。例如,“[^]0-9-]”表示集合“除了右括号、零到九和连字符之外的所有内容”。字符串以不在(或带有扬抑符的)集中的字符出现或当字段宽度用完时结束。

因此,%[^\n] 应该读取回车符之前的所有内容。

  • 它读取换行符之前的所有内容,但*不*换行符本身。如果你循环 `fscanf(file, "%[^\n]")`,你只会一遍又一遍地得到空字符串。您需要使用格式字符串中的空格或类似“%*c”的内容来使用换行符。 (2认同)