注意strncpy的n

来源:互联网 发布:紫猫编程学院全套教程 编辑:程序博客网 时间:2024/06/06 16:48

前几天写了一个传输文件的程序,发现传输文本可以,换成图片接受端不能正常显示。后来发现是发送端每次读取文件内容和send之间的处理不恰当,导致在发送含有字符串结束符0时,发送内容不完整。写个程序验证,代码如下:

例一:strncpy

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <strings.h>#include <string.h>int main(){FILE *fp=NULL;char buffer1[5+1024+1]={0};char buffer2[1024+1]={0};size_t readsize=0;if( NULL==(fp=fopen("/home/yyellow/1.png", "r")) ){printf("fopen fial\n");exit(0);}while( !feof(fp) ){bzero(buffer2, 1024);readsize=fread(buffer2, 1, 1024, fp);sprintf(buffer1, "%c%04d", 'r', 1024);strncpy(buffer1+5, buffer2, readsize);if( ferror(fp) ){printf("fread wrong\n");exit(0);}printf("readsize:%lu\n", readsize);}return 0;}
gdb调试结果:

strncpy发现在n范围之内存在字符串结束标志0时,即使有n做约束,后面的非0字符也不会拷贝。可以使用memcpy代替。

用gdb调试过程中发现在打印字符串时:在栈中分配的,无论有没有字符串0,都会打印出来;在堆中分配的显示到字符串结束标志0为止。