C++ 关于string , strncpy是否会在结尾自动添加'\0'的问题
答案:2 悬赏:80 手机版
解决时间 2021-11-26 10:08
- 提问者网友:杀手的诗
- 2021-11-26 07:18
C++ 关于string , strncpy是否会在结尾自动添加'\0'的问题
最佳答案
- 五星知识达人网友:玩世
- 2021-11-26 08:09
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数组不同这一点的确不太好解释。
你再查查其他资料,如果知道原因了,顺便也告诉下我...
strncpy在msdn上的解释是:
当函数的第三个参数小于等于第二个参数的长度时,空字串不会被加到参数一的结尾。
当函数的第三个参数大于第二个参数的长度时,参数一copy完字符串后到整个空间结束全部被置为空字符。string自己提供了获取长度和容量的成员函数
str1.length(); // 获取长度
str1.capacity(); // 获取容量至于c_str()得到的东西到底是怎样的。看源码注释是说带有结尾字符的常量字符串,但是为什么在strlen和sizeof操作下和C语言的char数组不同这一点的确不太好解释。
你再查查其他资料,如果知道原因了,顺便也告诉下我...
全部回答
- 1楼网友:蓝房子
- 2021-11-26 08:24
string的实现各不相同,建议不要用 strcpy之类的函数,有些使用了'\0',有些'\0'是被隐藏的
直接使用string::assign 等string提供的函数比较保险
比如
char str1 = "hello"
std::string str2(str1);
std::string str3;
str3.assign(str1, str1 + strlen(str1));
直接使用string::assign 等string提供的函数比较保险
比如
char str1 = "hello"
std::string str2(str1);
std::string str3;
str3.assign(str1, str1 + strlen(str1));
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯