Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有std::string的简单程序不工作_C++_String - Fatal编程技术网

C++ 带有std::string的简单程序不工作

C++ 带有std::string的简单程序不工作,c++,string,C++,String,我正在学习std::string,我想: 输入字符串 每一个字母都是大写的 输出新字符串 #include "stdafx.h" #include <iostream> #include <string> using namespace std; int main() { string myStr; getline(cin,myStr); if (myStr.begin() != myStr.end()) { for (a

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

  • 输入字符串
  • 每一个字母都是大写的
  • 输出新字符串

    #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;
    }
    
    #包括“stdafx.h”
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    字符串myStr;
    getline(cin,myStr);
    if(myStr.begin()!=myStr.end())
    {
    对于(自动it=myStr.begin();it!=myStr.end();it+=2)
    *it=toupper(*it);
    }
    
    如果循环结束条件为
    it!=myStr.end()
    ,则cout
    it+=2
    会导致您越界。从而取消引用

    *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]); 
        }
    }
    
    for(size_t i=0;i
    按“重试”启动调试器并查看代码中崩溃发生的位置。这不是问题,而是测试
    if(myStr.begin()!=myStr.end())
    没有任何作用,因为循环条件无论如何都会消除这种情况。@PeteBecker如果字符串为空,这是一种过早的优化。因为所有过早的优化都毫无价值,也不需要。所以我如何修复它呢?对于大小相等的字符串,每两个字母都会大写。@SergeyA有一个u你知道如何使我的程序也能处理大小均匀的字符串吗?@kam_b99,
    std::string::iterator
    是一个。你可以使用
    it
    而不是条件中的
    it!=myStr.end()
    。@kam_b99我很确定至少我所建议的方法是有效的。