在C语言中删除换行符

5
我正在尝试使用getc(character)从文件中获取元素并进行操作,但似乎必须在行末有一个'\n'。 我该如何移除它,这样当我复制字符时就不会出现换行符,从而允许我在选择时处理打印新行?

不是的,我在我的帖子中做作业时总是会说的。 - Biscuit128
2
小伙伴们:求代码呀!不告诉我们代码就给大家点踩,这太不公平了…… - t0mm13b
2
@tommieb75:loz没有点踩(他还在0分,正在学习SO的使用方法) - lexu
7个回答

6
.
.
.
#include <string.h>
.
. /* insert stuff here */
.
char* mystring = "THIS IS MY STRING\n"
char* deststring;
.
.
.
strncpy(deststring, mystring, strlen(mystring)-1);
.
.
.
< p >(顺便说一句,我不太喜欢在字符串中丢弃\0字符。当你开始进行i18n并且字符宽度不固定时,它不起作用。例如,UTF-8可以使用1到4个字节每个“字符”)

作为额外的注意事项,我不建议在字符串中丢弃\0字符。这在做i18n时会有问题,因为字符宽度是不固定的。例如,UTF-8可以使用1到4个字节每个“字符”。

5

要用空格替换所有换行符,请使用:

char *pch = strstr(myStr, "\n");
while(pch != NULL)
{
    strncpy(pch, " ", 1);
    pch = strstr(myStr, "\n");
}

要删除字符串中第一次出现的换行符,请使用:

char *pch = strstr(myStr, "\n");
if(pch != NULL)
  strncpy(pch, "\0", 1);

1
@Hector,现在我已经添加了描述。 - Nitinkumar Ambekar

4
您可以将其替换为一个空终止符。 以下是我脑海中的一种(简单)方法:
 mystr[ strlen(mystr) - 1 ] = '\0';

在清除之前,你应该验证一下字符是否为LF吗? - lexu
一切都很好,直到你的雇主决定国际化,并且你的字符串变成UTF-8编码。 - JUST MY correct OPINION
没错,但是你的解决方案也有同样的问题。通常情况下,为了处理Unicode,你需要使用一组不同于str*系列的函数。例如,在Win32编程中使用wcscpy而不是strcpy。无论如何,这只是一个快速的例子。 - Justin Ethier
@lexu - 你的意思是代码应该检查要替换的字符是否为换行符吗?是的,那可能是个好主意。然而,所有的解决方案或多或少都假设他的代码已经进行了这个检查。 - Justin Ethier
这就是Kernighan和Pike在他们的《编程实践》第26页中建议的惯用语。 - RainDoctor

3
嗯,使用getc填充缓冲区并删除换行符和回车符是否有帮助?

如果他已经在使用getc,那么最好不要在将字符复制到缓冲区时这样做。 - JUST MY correct OPINION

1
假设bufchar类型的,并且它保存了从文件中读取的字符串值...
buf[strlen(buf)-1] = '\0';
这将把缓冲区的倒数第二个字符设置为null,即'\0',以删除换行符。 编辑:由于loz提到了编译器错误,我怀疑使用了const char *...请问我们能看到代码吗...

这会产生一个错误,指出传递给strlen的第1个参数是整数而不是指针。 - Biscuit128
在删除它之前,你不应该验证这个字符是否是lf吗? - lexu
一切都很好,直到你的雇主决定国际化,你的字符串变成UTF-8编码。 - JUST MY correct OPINION
谁给这个点了踩?如果loz没有发布代码,我们就是在自己的脚上开枪...我们该怎么知道呢... - t0mm13b

0

以下代码可以解决问题

line[strlen(line) - 1] = 0

0

稍微完整一点的版本:

char* end = line + strlen(line) - 1 ;          // end of line                                                                                                      
while( (end > line) && isspace(*end) ) end--;  // right trim space                                                                                              
*(end+1) = '\0';                               // terminate string

(注:在字符串中放置空字符会使字符串读取器停止在该点处阅读,但“line”的内存占用量相同。 '\0'右侧的字符仍然存在。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接