从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】:您不需要 strlen
和 recv
- 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);
【讨论】:
我试过这个,但现在我什么也没得到。我总是在箭头内打印用户名,现在我得到了这个:在我得到这个之前:\r\n
(回车换行)。剥离\n
会留下一个裸露的\r
,这可能会清除输入行。
我应该尝试剥离 \r 然后剥离 \n 吗?
您可能应该首先检查其中是否有\r
。您可以使用strchr
或类似的方式找到它。
@Gustavo Dos Santos - 主要是查看从套接字读取返回的字节。其他一切都是猜想。我建议使用调试器。请使用此信息更新您的帖子。以上是关于从char字符串c ++中删除新行的主要内容,如果未能解决你的问题,请参考以下文章