我有一个字符数组。其中一些被*包围。如果找到一个,我希望它放入我的缓冲区数组。我在我的观察窗口看了一下test [i] + 1,它做了我想要的。它读作“示例*”。我想如果我使用strncpy来复制它的两个字符大于它的大小,我会得到“示例”,但相反,我得到的东西就像“例子”。或“示威者。”,这对我没有任何意义。
char ** test;
char * buffer;
int elemLen;
if (*test[i] == '*')
{
elemLen = strlen(test[i]);
strncpy(buffer, test[i] + 1, elemLen - 2);
}
答案 0 :(得分:4)
您必须手动添加空字符,因为strncopy不会为您执行此操作。
即
elemLen = strlen(test[i]);
strncpy(buffer, test[i] + 1, elemLen - 2);
buffer[elemLen - 2] = '\0';
答案 1 :(得分:0)
str
的{{1}}部分指的是它将字符串作为输入。它并不总是创建一个字符串作为输出。
我的建议是不要使用它,因为很多阅读你代码的人都和你在同一条船上而没有意识到它不会创建一个字符串作为输出。
此外,strncpy
的第三个参数应该是目标缓冲区大小。如果您实际上是在尝试指定要复制的字符数,那么您与strncpy
的目的相冲突,因为它应该读取以空字符结尾的字符串作为输入,而不是多个字符。
事实上,您的代码甚至不清楚strncpy
指向的内存量。如果你已经确定buffer
足够大,那么buffer
不是正确的函数,因为它存在限制缓冲区溢出,但没有溢出缓冲区的危险。
以下是两种替代方法,其中strncpy
是字符串,您确保s
足够大:
buffer
或
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';
也是一个聪明的举动; len >= 2
版本很容易修改(使用sprintf
)也可以将输出缓冲区大小作为参数。