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