我正在尝试从套接字读取char数组,并获取整数值,然后可以在for循环中使用该整数值。很遗憾,我在atoi()遇到了分段错误。我做错什么了?

bytesRead = read(sock, buffer, 1024);
buffer[bytesRead] = '\0';
char tmp[bytesRead];                // I suspect creating this shorter
strncpy(tmp, buffer, bytesRead);    // array is not necessary... but not sure.
int num = atoi(tmp);

最佳答案

要确保tmp是一个C-“字符串”,即携带0终止符。更改以下内容:

char tmp[bytesRead];

成为
char tmp[bytesRead + 1] = "";

上面的修改做了两件事:
再分配一个字节,然后使用。
将所有字节设置为零。
因此,如果通过调用bytesRead覆盖第一个strncpy()字节,则最后一个字节保持不变,并继续保持'\0',即它0-终止char-数组,从而使其成为C-“字符串”。
顺便说一句,这句话:
buffer[bytesRead] = '\0';

要求buffer至少引用1024 + 1字节。。。
但是不需要引入tmp的用法。代码也可能如下所示:
char buffer[1024 + 1];
ssize_t result = read(sock, buffer, sizeof buffer - 1);
if (-1 == result)
{
  perror("read() failed");
}
else
{
  size_t bytesRead = result;
  buffer[bytesRead] = '\0';
  int num = atoi(buffer);
  if (0 == num)
  {
    fprintf(stderr, "atoi() (might have) failed");
  }
  ...
}

关于c - 如何从C中的套接字读取整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28861004/

10-11 19:38
查看更多