关于字符串地址的问题
大家好,我在初始化字符串数组时遇到这么一个问题。
首先,我定义了一个结构体
struct buffer{
// ....
char packet_head_1[4];
char packet_head_2[4];
} ;
然后是初始化函数
int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)
{
int i;
for (i = 0; i
Buf->packet_head_1[i] = *(head_ptr_1 + i);
Buf->packet_head_2[i] = *(head_ptr_2 + i);
}
}
然后在main中调用Init
//.....
struct buffer test_buf
Init(&test_buf, "$ABC", "$DEF")
我的本意,是把"$ABC"分配给Buf->packet_head_1,把"$DEF"分配给Buf->packet_head_2,但是在C++6.0中断点调试,发现Buf->packet_head_1的实际值是"$ABC$DEF \"(最后面还跟了个\号),而Buf->packet_head_2的值正常,为"$DEF \",我想因为地址是连续的,所以Buf->packet_head_1也就访问了Buf->packet_head_2的区间,但是现在我不想让他这么做,请问大家我有什么办法吗?另外最后面的那个"\"号是什么呢?如果是"\0",在C++6.0是显示一个空位啊。
------解决方案--------------------
char packet_head_1[4];
----->
char packet_head_1[5];
字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。
比把多余的哪一个设置为0x00 也就是\0
这是字符串的结束标识符,
C语言是考这个来定位 字符串结束的地方。
------解决方案--------------------
引用:Quote: 引用:char packet_head_1[4];
----->
char packet_head_1[5];
字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。
比把多余的哪一个设置为0x00 也就是\0
这是字符串的结束标识符,
C语言是考这个来定位 字符串结束的地方。
谢谢relaxisland,我试过把长度增加为20,但是Buf->packet_head_1最后得到的值到最后还是"$ABC????????????$DEF\",而我后面的程序是想用strcmp()比较一个temp[4]和Buf->packet_head_1的值,这样的话即使temp[4]内的值是"$ABC",但是用strcmp()还是会得到两者不同的结果。
应该在你想结束的地方 设置为 0 啊
或者字符数组赋值前,把所有的的元素 初期化为 0x00
------解决方案--------------------
引用:Quote: 引用:char packet_head_1[4];
----->
char packet_head_1[5];
字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。
比把多余的哪一个设置为0x00 也就是\0
这是字符串的结束标识符,
C语言是考这个来定位 字符串结束的地方。
谢谢relaxisland,我试过把长度增加为20,但是Buf->packet_head_1最后得到的值到最后还是"$ABC????????????$DEF\",而我后面的程序是想用strcmp()比较一个temp[4]和Buf->packet_head_1的值,这样的话即使temp[4]内的值是"$ABC",但是用strcmp()还是会得到两者不同的结果。
int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)
{
int i;
for (i = 0; i
Buf->packet_head_1[i] = *(head_ptr_1 + i);
Buf->packet_head_2[i] = *(head_ptr_2 + i);
}
Buf->packet_head_1[4] = ‘\0’;
Buf->packet_head_2[4] = ‘\0’;
}
------解决方案--------------------
int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)
{
memset(Buf->packet_head_1, 0, sizeof(Buf->packet_head_1) );
memset(Buf->packet_head_2, 0, sizeof(Buf->packet_head_2) );
strcpy(Buf->packet_head_1, head_ptr_1);
strcpy(Buf->packet_head_2, head_ptr_2);
}
strcpy的时候注意数组越界
------解决方案--------------------
数组访问越界
------解决方案--------------------
“多一少一”问题占程序员常犯错误的10%以上!
避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为
x、x-1、x+1中的哪个?
、>=中的哪个?