如何从 C 中的套接字读取整数

How to read an integer from a socket in C

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

bytesRead = read(sock, buffer, 1024);
buffer[bytesRead] = '[=10=]';
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-"string",即带有 0 终止符。更改以下内容:

char tmp[bytesRead]; 

成为

char tmp[bytesRead + 1] = "";

上面的修改做了两件事:

  1. 再分配一个字节,然后您将使用。
  2. 将所有字节设置为零。

因此,如果您通过调用 strncpy() 覆盖第 1st bytesRead 个字节,最后一个字节将保持不变,并且继续 '[= 18=]',即 0-终止 char-数组,并由此使它成为 C-"string".


顺便说一句,这一行:

buffer[bytesRead] = '[=12=]';

需要 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] = '[=13=]';
  int num = atoi(buffer);
  if (0 == num)
  {
    fprintf(stderr, "atoi() (might have) failed");
  }
  ...
}