我正在为项目使用C Style字符串,我有点困惑自己。我正在检查字符串以查看它们之前的内容(zone_,player_等),然后在此之后获取字符串的其余部分。
else if(strncmp(info, "zone_", 5) == 0)
{
int len = strlen(info);
char *zoneName = new char[len];
strncpy(zoneName, &info[5], len-5);
Msg("Zone Selected: %s\n", zoneName);
delete zoneName;
}
当我打印出zoneName变量时,它是正确的,除了它后面是一堆乱码。我究竟做错了什么? (我意识到乱码是char数组的其余部分是空的,但我不知道更好的方法来做到这一点)
答案 0 :(得分:2)
请参阅strncpy说明:
没有隐含的空字符 附加到目的地的末尾,所以 目的地只会 如果C的长度,则以null结尾 源中的字符串小于num 。
答案 1 :(得分:1)
你必须记住,C风格的字符串以NUL字符终止。您已在zoneName
中分配了足够的空间,但只需要len-5
加一:
char *zoneName = new char[len - 5 + 1];
然后,您实际上可以使用strcpy()
复制字符串的尾部:
strcpy(zoneName, &info[5]);
您无需指定长度,因为源字符串已终止NUL。
答案 2 :(得分:0)
C字符串为零终止 - 因此它们占用len
个字节(准确的字符)加上一个值为零的称为“零终结符”。您需要再分配一个字符,并从源中复制一个(因为它应该是零终止)或者只是将目标的最后一个字符设置为0。
int len = strlen(info);
char *zoneName = new char[len - 5 + 1];
strncpy(zoneName, &info[5], len - 5 + 1);
答案 3 :(得分:0)
C风格的字符串必须用一个零值的字节来完成。你应该修改你的代码:
char *zoneName = new char[len-5+1];
strncpy(zoneName, &info[5], len-5);
/* correct string ending */
zoneName[len]=0;
/* Now, it's safe to print */
Msg("Zone Selected: %s\n", zoneName);