user-0 提问: 关于局部变量数组初始化的问题，求助~~~

回复:
user: user-1
content: 必须初始化字符数组： char buffer[34]="\0";

user: user-2
content: 你的打印 buffer 的函数有错误，打印到 buffer 以外去了，

user: user-3
content: 引用 3 楼 xydp1987108 的回复:char buffer[34] = {0}  ++1  临时变量就这样初始化了，new的变量 可以menset()    也可以想你那样for去赋值

user: user-4
content: char buffer[34] = {0}; 初始化一下试试

user: user-5
content: char buffer[34] = {0}

user: user-6
content: '\0'的值是0, '0'的值是32 两个是不一样的

user: user-6
content: 应该初始化成 buffer[i] = '\0';

user: user-7
content: char buffer[34] = {0}; 初始化一下试试

user: user-8
content: 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);     } }

user: user-8
content: 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);     } }

user: user-0
content: 引用 17 楼 binaryhead 的回复:[quote=引用 15 楼 puj2003 的回复:]         char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548C000000000000VI001214077505480001E难道不是34字节吗，后面的乱码是因为你声明的是char数组，VS开发环境在显示的时候：认为是一个可显示字符串，显示直到’\0’结束，这只是VS显示的问题。[/quote]  恩，你说的对，按照你的方法解决了，多谢，结贴给分

user: user-0
content: 引用 14 楼 user-10 的回复:楼主首先搞清楚的是buffer是用来存字符串的还是用来存字符数组的。 如果是存字符串就用printf("%s", buffer)输出， 如果是字符数组就应该用 for (i = 0; i < 34; i++)     printf("%c", buffer[i]); 你说的对，我在调log打印的时候用的是"%s"，将buffer所有内容都打出来了，现在改成循环打字符，至少不正确的字符是不会被打出来的。不过还是不明白buffer为什么会多出20个字节。

user: user-9
content: 引用 15 楼 puj2003 的回复:char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548C000000000000VI001214077505480001E难道不是34字节吗，后面的乱码是因为你声明的是char数组，VS开发环境在显示的时候：认为是一个可显示字符串，显示直到’\0’结束，这只是VS显示的问题。

user: user-4
content: 引用 15 楼 puj2003 的回复:char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548buffer[33] = 0;最后一个字节应该是结束符才对

user: user-0
content: char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548

user: user-10
content: 楼主首先搞清楚的是buffer是用来存字符串的还是用来存字符数组的。 如果是存字符串就用printf("%s", buffer)输出， 如果是字符数组就应该用 for (i = 0; i < 34; i++)     printf("%c", buffer[i]);

user: user-0
content: 我的意思是：明明buffer开的34个字节，怎么会把乱码也带进去了？而且我在终端也抓到了包：2014-11-18 13:22:01 服务器发送的消息：C000000000000VI001214077505480001E烫烫烫烫烫1407750548  困惑啊

user: user-4
content: 引用 10 楼 puj2003 的回复:不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"什么叫“元素都是超过34”？难道你越界写入了？

user: user-9
content: 引用 10 楼 puj2003 的回复:[quote=引用 4 楼 starytx 的回复:] char buffer[34] = {0}; 初始化一下试试 不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"[/quote]        问题出在你的发送程序而不是初始化程序。你只声明了34个字节的数组，你发送的字节就不能超过34字节，你需要的是调试你的发送程序。特别注意前面网友提到的：如果你的发送程序是判断’\0’作为发送结束条件的话，则你需要在34字节数组的内部的实际内容尾部添加’\0’，如果你本身就要发送34个字节有效信息，在前面的发送程序逻辑不修改的情况下，数组应该声明为35个字节，以便容纳有效信息刚好是34字节情形下的末尾’\0’。

user: user-0
content: 引用 4 楼 starytx 的回复:char buffer[34] = {0}; 初始化一下试试 不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"