为了账号安全,请及时绑定邮箱和手机立即绑定

从fgets()输入中删除尾随换行符

从fgets()输入中删除尾随换行符

湖上湖 2019-05-23 10:42:13
从fgets()输入中删除尾随换行符
查看完整描述

4 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

有点丑陋的方式:

char *pos;if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';else
    /* input too long for buffer, flag error */

有点奇怪的方式:

strtok(Name, "\n");

请注意,strtok如果用户输入空字符串(即仅按Enter),则该功能无法按预期工作。它使\n角色完好无损。

当然还有其他一些。


查看完整回答
反对 回复 2019-05-23
?
米脂

TA贡献1836条经验 获得超3个赞

也许最简单的解决方案使用我最喜欢的一个鲜为人知的功能strcspn()

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

如果你想要它也处理'\r'(比如,如果流是二进制):

buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...

该函数计算字符数,直到它击中a '\r'或a '\n'(换句话说,它找到第一个'\r'或者'\n')。如果没有碰到任何东西,它会停在'\0'(返回字符串的长度)。

请注意,即使没有换行,这也可以正常工作,因为strcspn在a处停止'\0'。在这种情况下,整条生产线只是替换'\0''\0'


查看完整回答
反对 回复 2019-05-23
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

size_t ln = strlen(name) - 1;if (*name && name[ln] == '\n') 
    name[ln] = '\0';


查看完整回答
反对 回复 2019-05-23
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

以下是'\n'从保存的字符串中删除潜在的快速方法fgets()
它使用strlen()2次测试。

char buffer[100];if (fgets(buffer, sizeof buffer, stdin) != NULL) {

  size_t len = strlen(buffer);
  if (len > 0 && buffer[len-1] == '\n') {
    buffer[--len] = '\0';
  }

现在使用bufferlen根据需要。

此方法具有len后续代码值的附带好处。它可以比它快得多strchr(Name, '\n')。 参考 YMMV,但两种方法都有效。


buffer,从原来fgets()不会包含在"\n"某些情况下:
A)线太长,buffer所以只有char'\n'保存之前buffer。未读的字符仍保留在流中。
B)文件中的最后一行没有以a结尾'\n'

如果输入'\0'在某处嵌入了空字符,则报告的长度strlen()将不包括该'\n'位置。


其他一些答案的问题:

  1. strtok(buffer, "\n");无法删除的'\n'时候buffer"\n"。从这个答案 - 在这个答案之后修改了警告这个限制。

  2. 以下罕见的情况下出现故障时,首先char通过阅读fgets()'\0'。输入以嵌入式开头时会发生这种情况'\0'。然后在合法范围之外肯定buffer[len -1]buffer[SIZE_MAX]访问内存buffer。黑客可能在愚蠢地阅读UTF16文本文件时尝试或找到的东西。写这个答案时,这就是答案的状态。后来一个非OP编辑它包括像这个答案的检查代码""

    size_t len = strlen(buffer);if (buffer[len - 1] == '\n') {  // FAILS when len == 0
      buffer[len -1] = '\0';}
  3. sprintf(buffer,"%s",buffer);是未定义的行为:参考。此外,它不会保存任何前导,分隔或尾随空格。现在已删除

  4. [编辑由于后来的好回答 ]与方法buffer[strcspn(buffer, "\n")] = 0;相比,除了性能之外,1衬垫没有问题strlen()。鉴于代码正在进行I / O(CPU时间的黑洞),修剪性能通常不是问题。如果以下代码需要字符串的长度或具有高度的性能意识,请使用此strlen()方法。否则这strcspn()是一个很好的选择。


查看完整回答
反对 回复 2019-05-23
  • 4 回答
  • 0 关注
  • 1237 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信