【问题标题】:Assign value in while condition在 while 条件下赋值
【发布时间】:2020-10-27 05:06:45
【问题描述】:

我是 c 编程的新手,目前我正在从事套接字编程,我对下面发生的事情感到困惑。我有一个 while 循环尝试打印从服务器接收到的值:

while(  recv( sock , buffer, sizeof(buffer), 0) > 0) {
    printf("%s\n",buffer );
};

如果我使用下面的格式,它看起来好像什么也没有收到:

int result;
while( (result = recv( sock , buffer, sizeof(buffer), 0)) > 0) {
    printf("%s\n",buffer );
};

正常运行,第一个和第二个有什么区别?貌似recv已经返回值了为什么不能直接使用?

谢谢

【问题讨论】:

  • 唯一的区别是你可以在while循环之后使用result
  • 这里没有足够的信息来了解发生了什么。另外,在打印之前如何确定缓冲区中有一个空终止符? recv() 不加一个...
  • 这是可能的.. 我的问题实际上是针对一般的 while 循环,赋值给 result 和没有它应该没有区别,这在 C 中是否正确?
  • 是的,recv() 调用在任何一种情况下都会发生。而且它不会被优化出来,因为它的返回值是未知的,而且它可能会产生超出为表达式返回值的影响。
  • 不同之处在于recv 的返回值在循环中可用,因此您可以终止字符串。这是两个循环之间的巨大差异。即使发送者应该终止字符串,也不应该使用第一个循环。依赖发送者意味着发送者中的错误可能表现为接收者中的段错误。

标签: c sockets while-loop variable-assignment


【解决方案1】:

printf("%s\n", buffer); 不安全。 buffer 不保证按照 %s 的要求以 NUL 结尾。您需要result 才能安全地执行此操作。

while (1) {
    ssize_t bytes_received = recv(sock, buffer, sizeof(buffer)-1, 0);
    if (bytes_received == -1) {
       perror("recv");
       exit(1);
    }

    if (bytes_received == 0) {
       break;
    }

    buffer[bytes_received] = 0;
    printf("%s\n", buffer);
}

否则,两者没有区别。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2010-11-11
    • 2016-01-13
    • 2013-11-15
    • 2011-12-08
    • 2019-05-29
    • 2013-07-14
    • 2018-09-20
    相关资源
    最近更新 更多