从char字符串c ++中删除新行

Posted

技术标签:

【中文标题】从char字符串c ++中删除新行【英文标题】:Remove new line from char string c++ 【发布时间】:2016-02-28 21:00:48 【问题描述】:

我一直在尝试删除 char 字符串末尾的新行。这是我一直在使用的。

char username[256];
recv(c->sock, username, sizeof username, 0);
username[strlen(username)-1] = 0;
c->SetName(username);

这对我不起作用,因为 char 字符串以某种方式被删除了一半。另一方面,如果我不尝试删除用户名末尾的新行,我得到的字符串没有问题。我尝试了很多方法,所有方法都得到了相同的结果。谢谢。

【问题讨论】:

“char 字符串以某种方式被删除了一半” 这还不清楚。你能给出actual输入和actual输出吗? 如果用户名是 gustavo 那么输出将是:tavo ***.com/help/mcve 【参考方案1】:

问:您是否在套接字写入中发送了 '\0' C 字符串分隔符?除非您这样做,否则“strlen()”将无法正常工作。

建议:在套接字读取后检查“用户名”中的字节:

1) 确保它实际上有 '\n',

2) 确保它有一个 '\0' C 字符串分隔符,并确保它是您期望字符串结尾的位置。

可能的解决方案:

  char username[256];
  int iret = recv(c->sock, username, sizeof username, 0);
  if (iret < 0) 
     <<handle error>>
  
  if (username[iret-2] == 0x0d) 
    username[iret-2] = 0;
   else if (username[iret-1] == '\n') 
    username[iret-1] = 0;
  
  ...

但是请不要猜测。请先查看实际输入

请不要使用“strlen()”或任何类似的 C 字符串函数,直到您确定字符串已被分隔。要么是因为你发送了“0”,要么是因为你把它放在那里。

另见:

https://en.wikipedia.org/wiki/Newline

【讨论】:

我确定它有 '\n' 但我不太确定它有 '\0' 分隔符。让我试一试。【参考方案2】:

您不需要 strlenrecv - recv 返回读取的字节数。因此,您可以这样做

char username[256];
int n = recv(c->sock, username, sizeof(username) - 1, 0); // recv here leaves room for a null terminator
if(n < 0) 
    /* recv error: you should handle this since it probably means the socket is closed */
    exit(1);

username[n] = 0; // make sure that input is null-terminated
if(n >= 1 && username[n-1] == '\n')
    username[n-1] = 0; // strip newline
setName(username);

【讨论】:

我试过这个,但现在我什么也没得到。我总是在箭头内打印用户名,现在我得到了这个:在我得到这个之前:记住gustavo是用户名 我认为问题可能是你得到了\r\n(回车换行)。剥离\n 会留下一个裸露的\r,这可能会清除输入行。 我应该尝试剥离 \r 然后剥离 \n 吗? 您可能应该首先检查其中是否有\r。您可以使用strchr 或类似的方式找到它。 @Gustavo Dos Santos - 主要是查看从套接字读取返回的字节。其他一切都是猜想。我建议使用调试器。请使用此信息更新您的帖子。

以上是关于从char字符串c ++中删除新行的主要内容,如果未能解决你的问题,请参考以下文章

C ++从多行字符串中删除新行

c语言 从字符串中删除特定字符

如何从 C 字符串中删除第一个字符?

从C中删除字符串中的空格?

从字符数组中删除字符

C语言从键盘输入一个字符串,并删除该字符串中所有大写字母字符