关于c++中缓存数组的问题

满船清梦 2018-04-10 12:01:11
在下面的代码中,recvData作为缓存数组缓存接受的数据。在下有点迷惑,就是缓存数组既然已经声明了长度,如果接收数据长度 小于数组长度,在下面的printf(recvData)中,缓存数组中多余的非数据部分会不会被打印出来?
char recvData[255];
int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr*)&remoteAddr, &nAddrLen);
if (ret > 0)
{
recvData[ret] = 0;
char sendBuf[20] = { '\0' };
printf("接受到一个连接:%s \r\n", inet_ntop(AF_INET, (void*)&remoteAddr.sin_addr, sendBuf, 16));
printf(recvData);
}

在下小白,求解答,不胜感激
...全文
894 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
轻箬笠 2018-04-16
  • 打赏
  • 举报
回复
个人觉得这种问题没有讨论的意义。 第一,数组声明或者使用的时候,要置零。这是实际项目里面有要求的,否则被发现,就等着项目组长找你麻烦吧。 第二,既然知道了数据的长度,那就应该按照长度输出,那才是安全的使用方式。
zilaishuichina 2018-04-16
  • 打赏
  • 举报
回复
printf 就不应该这样用, printf是用来输出字符串用的,输出到'\0'为止,不包括'\0'。 而你的recvData中收到的是数据, 数据不同于字符串, '\0'同样是一个数据, 我发送10个'\0',你就因该收到10个'\0',但是如果你把这10个'\0'当成字符串来处理,那就什么也没有了。 你可以按实际收到的数据长度,就是你的ret,循环逐个输出每一个数据的值

for(int i = 0; i < ret; i++)
{
    printf("%02x ", (unsigned char)recvData[i]);
}
JackyRao 2018-04-15
  • 打赏
  • 举报
回复
初始化为全0是必须的, 否则可能乱码
自信男孩 2018-04-10
  • 打赏
  • 举报
回复
既然是以%s输出的,那么是遇到'\0'停止输出,因此会不会输出未接收到的内存数据不是跟缓存大小有关的,而是跟’\0'的位置有关。
srhouyu 2018-04-10
  • 打赏
  • 举报
回复
若是将recvData初始化为全0的,那么它的空位置都是字符串结尾标志,能保证在字符串末尾停止。若没有,那就不能保证。
srhouyu 2018-04-10
  • 打赏
  • 举报
回复
引用 4 楼 weixin_41975709 的回复:
[quote=引用 1 楼 srhouyu 的回复:]
若是将recvData初始化为全0的,那么它的空位置都是字符串结尾标志,能保证在字符串末尾停止。若没有,那就不能保证。

那万一数组数据里面有0,代码怎么分辨这个0是数据的0还是初始化的时候给的0? [/quote]

0不是可显示的字符。
若你的数据都是可显示的字符,那么必然不含0,用printf显示是合适的
若你的数据不一定是字符,那么用printf显示显然不合适,应该用类似于下面的样式显示:
赵4老师 2018-04-10
  • 打赏
  • 举报
回复
仅供参考:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
自信男孩 2018-04-10
  • 打赏
  • 举报
回复
引用 3 楼 weixin_41975709 的回复:
那万一数组数据里面有0,代码怎么分辨这个0是数据的0还是初始化的时候给的0?
程序不会自动识别的。 printf(recvData);这样用比较少。但是也是可能的。比如recvData获取的是"helloworld"字符串。那么就相当于 printf("helloworld");
满船清梦 2018-04-10
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
既然是以%s输出的,那么是遇到'\0'停止输出,因此会不会输出未接收到的内存数据不是跟缓存大小有关的,而是跟’\0'的位置有关。
这里printf(recvData);,没有用%s输出啊
满船清梦 2018-04-10
  • 打赏
  • 举报
回复
引用 1 楼 srhouyu 的回复:
若是将recvData初始化为全0的,那么它的空位置都是字符串结尾标志,能保证在字符串末尾停止。若没有,那就不能保证。
那万一数组数据里面有0,代码怎么分辨这个0是数据的0还是初始化的时候给的0?
满船清梦 2018-04-10
  • 打赏
  • 举报
回复
那万一数组数据里面有0,代码怎么分辨这个0是数据的0还是初始化的时候给的0?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧