看下面这两句网络套接字编程中的代码:
char aRecvBuf[1000];
iRecvLen = recvfrom(g_iSocketServer, aRecvBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
aRecvBuf[iRecvLen] = '\0';
函数recvfrom()
的第三个参数999表示接收最多 999 字节的数据并存储到 aRecvBuf 中,aRecvBuf数组的大小为1000,那为什么这里不是最多接收1000字节呢?
这是因为recvfrom() 只是从网络中读取字节,并没有保证这些字节会以 ‘\0’ 结尾。为了能够将接收到的数据作为 C 字符串 处理,我们需要确保字符串正确结束。
aRecvBuf[iRecvLen] = '\0';
的作用是将接收到的数据的末尾标记为字符串结束符 ‘\0’,使得数据可以被正确地作为 C 字符串 使用。这是特别重要的,因为没有 ‘\0’ 终结符,许多字符串处理函数(如 printf 或 strncpy)就无法正确地计算字符串的长度或打印字符串。
C 字符串是以 ‘\0’ 作为终结符的,因此在操作字符串时,必须确保其末尾有 ‘\0’。否则,像 printf、strlen 等函数就无法识别字符串的结束位置,可能会导致内存越界错误或者程序崩溃。