【问题标题】:Why does string::begin() output the entire string in the immediate window为什么 string::begin() 在即时窗口中输出整个字符串
【发布时间】:2019-12-29 00:15:11
【问题描述】:

当我们在 Visual Studio IDE 中执行 string::begin() 时,它会返回一个指向字符串中第一个字符的迭代器。但是,当我们在即时窗口(或监视窗口)中键入 string::begin() 时,它会返回整个字符串。为什么会这样? 即时窗口不应以这种方式运行,因为 string::begin() 返回的是迭代器,而不是字符串。

以下是 Visual Studio IDE 中的代码:

int main()
{
    string s = "abc";
    string::iterator it = s.begin();
    cout << *it << endl;
    return 0;
}

以下是输出: 一个

但是,如果我们在即时窗口中键入 s.begin(),我们会得到以下输出:

s.begin()
"abc"
    [ptr]: 0x0133fd08 "abc"
    [Raw View]: {...}

s.begin() 在即时窗口中的结果应该是:它应该输出一个指向字符串中第一个元素的迭代器(即它应该输出一个指向'a'的迭代器)。但是 s.begin() 在即时窗口中输出整个字符串。为什么会这样?

【问题讨论】:

  • 当你说你期望“它应该输出一个迭代器”时,你能告诉我们你想象的“输出一个迭代器”是什么样子,如果不是这样吗?
  • 可能有三个因素在起作用。首先,您的实现(标准库)将std::string::iterator 实现为char *。其次,std::string 将字符串数据管理为以 nul 结尾的字符串(也称为“C 样式”字符串)。第三,您的 IDE 或调试器默认将指向 char 的指针(即char *)打印为 C 风格的字符串。其中前两个在 C++11 之前是不需要的,即使它是一个常见的实现选择,而第二个现在在 C++11 之后是有效的。第三个与您的 IDE 或调试器的工作方式有关。
  • @Peter 我们又来了。在答案部分回答谢谢;这不是聊天室。

标签: c++ string iterator visual-studio-2019


【解决方案1】:

这是因为调试器试图提供帮助。迭代器中的ptr 将是char*,通常当你有一个char* 时,你有一个c 字符串,你想查看字符串的全部内容,而不仅仅是指针指向的内容。这就是为什么您会看到完整的内容,而不仅仅是a。如果您查看了begin() + 1,那么您将看到bc 作为内容,因为现在指针指向b

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2017-05-18
    • 2010-12-11
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多