#include <iostream>
using namespace std
#include <string.h>
int main(){
char token[] = "some random string";
char c[23];
strcpy( c, token);
strncpy(c, token, 5);
c[strlen(c)] = '\0';
cout<<c;
return 0 ;
}
我的输出是:some random string
。但我希望它是:some
。有没有人能解释一下为什么会这样?
发布于 2012-12-25 11:51:32
我认为您的输出应该是“一些随机字符串”,因为您的两行代码没有做任何事情,请参见注释。
int main(){
char token[] = "some random string";
char c[23];
strcpy( c, token);
strncpy(c, token, 5); // Does nothing
c[strlen(c)] = '\0'; // Does nothing
cout<<c;
return 0 ;
}
如果你想输出"some",你可以这样做:
strncpy(c, token, 5);
c[5] = '\0';
strncpy()不会自动将尾随'\0‘添加到目标字符串。如果源字符串长度大于len (strncpy的第三个参数),则len字符复制到dest,不带尾随'\0‘。所以你必须通过代码显式地给出一个尾随的'\0‘。
发布于 2012-12-25 11:51:28
它工作得很好--记住strncpy
does not necessarily null-terminate the string。执行此操作时:
strncpy(c, token, 5);
它将token
的前5个字节复制到c
中,但不会对结果进行空终止。此外,这一行是无用的:
c[strlen(c)] = '\0';
strlen(c)
查找现有的空结束符,一旦找到,就用另一个空结束符覆盖它,这是没有意义的。
在新代码中,如果曾经使用过strncpy
,也应该很少使用。它的预期用途(固定长度的缓冲区,不一定以null结尾)早就被人们所关注了。最好使用像strlcpy
这样的函数(注意:strlcpy
不是标准的;它只在类似于BSD的系统中可用)。
或者,如果你用C++而不是纯C编写代码,那就使用std::string
,完全避免像这样的棘手问题。
发布于 2012-12-25 11:51:19
您需要在单词"some“之后使用null终止,而不是在整个字符串之后使用null终止。strncpy会将“strncpy”复制到c中,但它不一定以空值终止字符串(参见strncpy手册页)。
c[4] = '\0'
https://stackoverflow.com/questions/14027510
复制相似问题