C++ strncpy向我的字符数组添加额外字符

C++ strncpy向我的字符数组添加额外字符,c++,arrays,C++,Arrays,我有一个单词字符数组。其中一些被*包围。如果找到一个,我想把它放到我的缓冲区数组中。我看了看手表窗口中的test[I]+1,它做了我想要的事情。其内容为“示例*”。我想如果我用strncpy把这个复制过来,比它的大小少两个字符,我会得到“example”,但我得到的是“examples.”或“examplers.”,这对我来说毫无意义 char ** test; char * buffer; int elemLen; if (*test[i] == '*') { elemLen = st

我有一个单词字符数组。其中一些被*包围。如果找到一个,我想把它放到我的缓冲区数组中。我看了看手表窗口中的test[I]+1,它做了我想要的事情。其内容为“示例*”。我想如果我用strncpy把这个复制过来,比它的大小少两个字符,我会得到“example”,但我得到的是“examples.”或“examplers.”,这对我来说毫无意义

char ** test;
char * buffer;
int elemLen;
if (*test[i] == '*')
{
    elemLen = strlen(test[i]);
    strncpy(buffer, test[i] + 1, elemLen - 2);
}

您必须手动添加空字符,因为strncopy不会为您添加空字符

i、 e


strncpy
str
部分表示它接受字符串作为输入。它并不总是创建一个字符串作为输出

我的建议是不要使用它,因为很多阅读你的代码的人都会和你站在同一条船上,没有意识到它不会创建一个字符串作为输出

此外,
strncpy
的第三个参数应该是目标缓冲区大小。如果您实际上试图指定要复制的字符数,那么您就与
strncpy
的用途相冲突,因为它应该读取以null结尾的字符串作为输入,而不是大量字符

事实上,从代码中甚至不清楚
buffer
指向多少内存。如果您已经确定
buffer
足够大,则
strncpy
不是正确的函数,因为它的存在是为了限制缓冲区溢出,但没有溢出缓冲区的危险

这里有两种可选方法,其中
s
是字符串,并且您已确保
缓冲区足够大:

size_t len = strlen(s);
sprintf(buffer, "%.*s", (int)len - 2, s + 1);


注意:在复制字符之前检查
len>=2也将是明智之举;而且
sprintf
版本很容易修改(通过使用
snprintf
),也可以将输出缓冲区大小作为参数。

确保字符串以
'\0'
结尾。这就是所有代码吗<代码>缓冲区
未初始化,指向未知的位置,您正在将文本块复制到其中。“奇怪的额外字符”是我能想到的最不坏的结果。
buffer
是一个未初始化的指针,
strncpy
不会在字符串长度超过缓冲区大小时终止字符串。谢谢大家。我现在明白我的问题了。缓冲区有我以前使用过的额外字符。我需要一个空字符在我的字符串的结尾。我刚刚注意到,就在你回答之前。非常感谢。@MichaelBlake如果您已经解决了这个问题,请接受答案=)应该是
buffer[elemLen-2]='\0',数组的索引为零,因此终止符的索引与stringGood catch@Mattmcnab中的字符数相同。
size_t len = strlen(s);
sprintf(buffer, "%.*s", (int)len - 2, s + 1);
size_t len = strlen(s);
memcpy(buffer, s + 1, len - 2);
buffer[len - 2] = '\0';