从char string c ++

时间:2016-02-28 21:00:49

标签: c++ arrays string pointers char

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

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

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

2 个答案:

答案 0 :(得分:2)

问:你发了' \ 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;
  }
  ...

请不要&#39; GESS 。请先查看 ACTUAL INPUT

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

另见:

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

答案 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);
相关问题