strncpy没有按预期工作

Ken*_*nta 0 c++ string strncpy

#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 ;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:some random string.但我希望它是:some.任何人都可以解释为什么它的行为像这样?

Ada*_*eld 6

它的工作原理很好,strncpy不一定是null终止字符串.当你这样做:

strncpy(c, token, 5);
Run Code Online (Sandbox Code Playgroud)

它复制了前5个字节tokenc ,但不空终止结果.此外,这条线是没用的:

c[strlen(c)] = '\0';
Run Code Online (Sandbox Code Playgroud)

strlen(c) 查找现有的null终止符,并且一找到,就用另一个null终止符覆盖它,这是没有意义的.

在新的代码,strncpy应该很少,如果有的话可以使用.它的预期用途(固定长度的缓冲区,不一定是空终止的)长期以来一直被人们所使用.更喜欢类似的功能strlcpy(注意:strlcpy不是标准的;它仅在类似BSD的系统中可用).

或者,如果您使用C++而不是纯C进行编码,那么只需使用std::string并避免类似这样的棘手问题.