C++ 关于string , strncpy是否会在结尾自动添加'\0'的问题

本人原来学过C语言,现自学C++。在做练习的时候对string,strncpy是否会在结尾自动添加'\0'的问题有点纠结。先自己写了个程序输出没有问题,于是我将程序改了一... 本人原来学过C语言,现自学C++。在做练习的时候对string , strncpy是否会在结尾自动添加'\0'的问题有点纠结。
先自己写了个程序

输出没有问题,于是我将程序改了一下

输出也没有问题,那我就认为strncpy在空间足够大的情况会自动加上结束符。这时候我想起sizeof()函数能将原字符串整个大小都测出来,于是我又将程序改了一下。

这个时候就出现乱码了,有大神能告诉我到底是什么原因吗?
展开
 我来答
never715
2013-12-02 · TA获得超过942个赞
知道小有建树答主
回答量:1010
采纳率:84%
帮助的人:466万
展开全部

strlen和sizeof作用于string通过字符串化c_str()得出的字符串结果都是一样的。所以用strlen时通过+1使得strncpy将最后一个结尾符拷贝过去了,但是用sizeof的时候没有+1,结果就没有最后的结尾符拷贝到p里面,输出没有碰到结尾符,才会乱码。

strncpy在msdn上的解释是:

当函数的第三个参数小于等于第二个参数的长度时,空字串不会被加到参数一的结尾。
当函数的第三个参数大于第二个参数的长度时,参数一copy完字符串后到整个空间结束全部被置为空字符。

string自己提供了获取长度和容量的成员函数

str1.length();    // 获取长度
str1.capacity();  // 获取容量

至于c_str()得到的东西到底是怎样的。看源码注释是说带有结尾字符的常量字符串,但是为什么在strlen和sizeof操作下和C语言的char数组不同这一点的确不太好解释。

你再查查其他资料,如果知道原因了,顺便也告诉下我...

template__
2013-12-02 · 超过67用户采纳过TA的回答
知道答主
回答量:149
采纳率:100%
帮助的人:131万
展开全部
string的实现各不相同,建议不要用 strcpy之类的函数,有些使用了'\0',有些'\0'是被隐藏的

直接使用string::assign 等string提供的函数比较保险
比如
char str1 = "hello"
std::string str2(str1);
std::string str3;
str3.assign(str1, str1 + strlen(str1));
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式