strlen 和 string.length()结果不一致?

shuaishuai24 2016-09-05 04:58:24

#include <iostream>
#include <string>

using namespace std;
#define _CRT_SECURE_NO_WARNINGS

void main()
{
string str1,str2;
int n;
str1 = "WFW";
cin >> str2 ;
str1 += str2;
n = str1.length();
str1[n] = 0x0a;
n = str1.length();
char c[20];
strcpy(c,str1.c_str());
for (int i = 0;; i++)
{
cout << *(c+i);
if (*(c+i) == 0x0a)
{
cout <<strlen(c)<< endl;
cout << i<< endl;
cout << n<< endl;
break;
}

}

}

不是说用了c_str()方法在结尾会自动加一个‘0\’吗?希望大神解答一下,谢谢!
...全文
600 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2016-09-09
  • 打赏
  • 举报
回复
21.4.5 basic_string element access [string.access] const_reference operator[](size_type pos) const; reference operator[](size_type pos); 1 Requires: pos <= size(). 2 Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior. 3 Throws: Nothing. 4 Complexity: Constant time. 当你遇到 UB ,那么程序的结果就是不可预知的。
lm_whales 2016-09-09
  • 打赏
  • 举报
回复
使用 string,如果,你不能控制越界访问, 不要用 operator[] ,请用 at 成员函数, 这个函数可以保证,不放过越界访问的代码, 从而你的代码不会有越界后, 还能正常运行的错误,避免安全问题的出现。 从而是安全的, 代价是。。。。。会产生异常
lm_whales 2016-09-09
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
 
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
 
void main()
{
    string str1,str2;
    int n;
    str1 = "WFW";
    cin >> str2 ;
    str1 += str2;
    n = str1.length();
    //str1[n] = 0x0a; //operator[] 不检测位置的合法性,需要检测,请用 at 函数 
     str1.at(n)=0x0a;
    n = str1.length();
    char c[20];
    strcpy(c,str1.c_str());
    for (int i = 0;; i++)
    {
        cout << *(c+i);
        if (*(c+i) == 0x0a)
        {
            cout <<strlen(c)<< endl;
            cout << i<< endl;
            cout << n<< endl;
            break;
        }
 
    }
 
}
改成这样你的程序就对头了
lm_whales 2016-09-09
  • 打赏
  • 举报
回复
operator [] 是不会产生异常的,不检查位置是否正确 如果需要让结果合理,请用 s.at(n) 用了at 如果n非法,会抛出异常的 operator [] 是不会的
GodMDZZ 2016-09-09
  • 打赏
  • 举报
回复
输出是4的话是地址 输出是17的话应该是正常长度
  • 打赏
  • 举报
回复
问题出在这里 str1[n] = 0x0a; 这样操作很危险的。因为会把结束符给冲掉。。。 直接用str1+这类的操作,就不会把结束符给冲掉。 问题已经很明显了,字符串的结束符没有了,后面的strcpy,strlen肯定不准。。。
paschen 版主 2016-09-05
  • 打赏
  • 举报
回复
strlen是不计算结尾的\0的,string::length同样 http://en.cppreference.com/w/cpp/string/byte/strlen http://en.cppreference.com/w/cpp/string/basic_string/size
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
pengzhixi 2016-09-05
  • 打赏
  • 举报
回复
你自己要看strcpy的行为啊
小灸舞 2016-09-05
  • 打赏
  • 举报
回复
你这个写法本来就是有问题的:str1[n] = 0x0a;
这样会造成越界
而且string.length()返回的是string类里的一个成员变量(存储的是字符串的长度)
你str1[n] = 0x0a;这种写法并不会使得这个成员变量产生变化
shuaishuai24 2016-09-05
  • 打赏
  • 举报
回复
输出分别为17 ,4, 4

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧