首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy未按预期工作

strncpy未按预期工作
EN

Stack Overflow用户
提问于 2012-12-25 11:45:21
回答 4查看 4.3K关注 0票数 0
代码语言:javascript
运行
复制
#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。有没有人能解释一下为什么会这样?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-25 11:51:32

我认为您的输出应该是“一些随机字符串”,因为您的两行代码没有做任何事情,请参见注释。

代码语言:javascript
运行
复制
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",你可以这样做:

代码语言:javascript
运行
复制
strncpy(c, token, 5);
c[5] = '\0';

strncpy()不会自动将尾随'\0‘添加到目标字符串。如果源字符串长度大于len (strncpy的第三个参数),则len字符复制到dest,不带尾随'\0‘。所以你必须通过代码显式地给出一个尾随的'\0‘。

票数 4
EN

Stack Overflow用户

发布于 2012-12-25 11:51:28

它工作得很好--记住strncpy does not necessarily null-terminate the string。执行此操作时:

代码语言:javascript
运行
复制
strncpy(c, token, 5);

它将token的前5个字节复制到c中,但不会对结果进行空终止。此外,这一行是无用的:

代码语言:javascript
运行
复制
c[strlen(c)] = '\0';

strlen(c)查找现有的空结束符,一旦找到,就用另一个空结束符覆盖它,这是没有意义的。

在新代码中,如果曾经使用过strncpy,也应该很少使用。它的预期用途(固定长度的缓冲区,不一定以null结尾)早就被人们所关注了。最好使用像strlcpy这样的函数(注意:strlcpy不是标准的;它只在类似于BSD的系统中可用)。

或者,如果你用C++而不是纯C编写代码,那就使用std::string,完全避免像这样的棘手问题。

票数 6
EN

Stack Overflow用户

发布于 2012-12-25 11:51:19

您需要在单词"some“之后使用null终止,而不是在整个字符串之后使用null终止。strncpy会将“strncpy”复制到c中,但它不一定以空值终止字符串(参见strncpy手册页)。

代码语言:javascript
运行
复制
c[4] = '\0'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14027510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档