【问题标题】:How to trim '\n' from the end of fgets() output [duplicate]如何从 fgets() 输出的末尾修剪 '\n' [重复]
【发布时间】:2016-04-05 14:51:33
【问题描述】:

我想从 fgets 输出中修剪换行符。

while(fgets(buff,1024,fp) ){

    printf("start%send",buff );

如果文件中有一行“C 很酷”,则 .然后打印上面的代码。

startC is cool
end 

但我希望它像

那样打印
 startC is coolend 

怎么做

【问题讨论】:

  • 肮脏的做法buff[strlen(buff)-1] = 0;
  • @Lashane:在没有输入 (EOF) 且strlen(buff) 为 0 的情况下很危险。

标签: c


【解决方案1】:

干净的方法

#include <string.h>

//...

buff [ strcspn(buff, "\r\n") ] = 0;

这对于任何形式的行尾都可以安全地工作,即使不存在,即使字符串为空。

【讨论】:

  • 不错的方法,但评论具有误导性,并且与答案的其余部分相反。
  • @R.. 谢谢,但你能解释一下你对我的评论的评论吗?
  • 注释说 trailing 换行符,但您的代码实际上是在第一个换行符(或回车符)处截断字符串。 fgets 不能产生一个换行符,除了一个尾随的换行符,但可以有很多嵌入的回车符。
  • @R.. 如果有,那么您可以修改代码以适应。但我通常不会在文本文件中遇到“大量嵌入式回车”。即使它是代码源文件,在字符串文字中,它们也会被转义。
  • 确实如此。我不认为这是一个主要的实际问题,只是评论令人不安。反正我 +1 了。
【解决方案2】:

您可以将最后一个字符设置为'\0'(空终止符)。这不是一个好方法,因为文件可能并不总是有换行符。

buff[strlen(buff) - 1] = '\0';

或循环遍历字符数组末尾,将'\n' 替换为'\0'

int i;
for(i = 0; i < strlen(buff); i++)
{
    if(buff[i] == '\n')
    {
        buff[i] = '\0';
        break;
    }
}

或者用strcspn()去掉末尾的'\n'

buff[strcspn(buff, "\r\n")] = 0;

【讨论】:

  • 从文件中读取的最后一行可能没有newline,在这种情况下,您的第一个示例很弱。 newline 不是fgets 添加的,它是文件中的内容。
  • 没错,我只是将它包括在内,因为它是一种适用于这个问题的方法。我将进行编辑以澄清这不是一个好方法。
  • 如果 strlen(buff) 为 0,则会产生危险的未定义行为。
  • 在这种情况下不会发生这种情况,因为 fgets 会返回一个空指针,这会导致 while 循环条件失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2011-04-07
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多