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()
,则coutit+=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我很确定至少我所建议的方法是有效的。