strncpy()得到字符串的结尾

时间:2010-12-11 09:51:50

标签: c++ string

我正在为项目使用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数组的其余部分是空的,但我不知道更好的方法来做到这一点)

4 个答案:

答案 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);