我一直在尝试删除字符串末尾的新行。这就是我一直在使用的。
char username[256];
recv(c->sock, username, sizeof username, 0);
username[strlen(username)-1] = 0;
c->SetName(username);
这对我来说不起作用,因为char字符串以某种方式被删除了一半。另一方面,如果我没有尝试删除用户名末尾的新行,我会收到字符串没有问题。我尝试了很多方法,并且我得到了相同的结果。感谢。
答案 0 :(得分:2)
建议:检查"用户名"中的字节数套接字读完后:
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;
}
...
但请不要&#39; GESS 。请先查看 ACTUAL INPUT 。
请不要使用&#34; strlen()&#34;或者任何类似的C字符串函数,直到您确定该字符串是分隔的。要么是因为你发送了&#34; 0&#34;,要是因为你把它放在那里。
另见:
答案 1 :(得分:1)
您不需要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);