使用std :: string的简单程序不起作用

时间:2016-01-05 20:08:14

标签: c++ string

我正在学习std::string,我想:

  1. 输入字符串
  2. 每隔一个字母制作大写
  3. 输出新字符串

    #include "stdafx.h" 
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        string myStr;
        getline(cin,myStr);
        if (myStr.begin() != myStr.end())
        {
            for (auto it = myStr.begin(); it != myStr.end() ; it += 2)
                *it = toupper(*it); 
        }
        cout << myStr;
        system("pause");
        return 0;
    }
    

    但输入后我收到错误here

1 个答案:

答案 0 :(得分:2)

如果循环结束条件为it += 2,则

it != myStr.end()会使您超出界限。因此解除引用

*it = toupper(*it); 

是未定义的行为。

it += 2永远不会为你的循环终止条件提供myStr.end()的精确迭代器值。

至于你的评论:

  

那我该如何解决呢?

保持简单易懂,例如使用像

这样的东西
for (size_t i = 0; i < myStr.length() ; ++i) {
    if(i % 2) { // Every second letter ...
        myStr[i] = toupper(myStr[i]); 
    }
}