C++ 如何在c++;?

C++ 如何在c++;?,c++,string,char,toupper,C++,String,Char,Toupper,我试图将字符串转换为大写字母字符串,方法是为字符串指定单个字符,如下所示:- #include <iostream> #include <string> #include <cstring> #include <cctype> using namespace std; int main() { string a; getline(cin,a); string b; b.reserve(a.size()+1); for(int

我试图将字符串转换为大写字母字符串,方法是为字符串指定单个字符,如下所示:-

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
  string a;
  getline(cin,a);
  string b;
  b.reserve(a.size()+1);
  for(int i=(a.size()),i1=0;1;i1++)
  {
    if(b[i1]!='\0')
        b[i1]=(char)toupper(a[i1]);
    else
    {
        a[i1]='\0';
        break;
    }
  }
  cout << b <<endl;
}

我的程序有什么问题??如何将单个字符分配给字符串???

您的程序存在一些问题。主要原因可能是和之间的差异。您希望在程序中使用的是一个长度为
a.size()
的字符串,因此,请使用
b.resize(a.size())

工作版本如下(有更好的编写方法,只是与OP提案最为一致):

#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
字符串a;
getline(cin,a);
b串;
b、 调整大小(a.size());
对于(inti1=0;i1cout Test
a
并赋值
b
@GillesGouaillardet的意思???尝试在反转字符串后显示(
cout这是什么奇怪的
int i=(a.size()),i1=0
这一切?你甚至不使用
i
b
是一个空字符串,即使在
reserve()
调用之后。
b.size()==0
仍然。因此,
b[i1]
是任何
i1
值的缓冲区溢出。您的程序显示未定义的行为。如果使用C++11,您只需执行:
for(char chA:a){…}
并将循环中的所有
a[i1]
替换为
chA
@Tuan333我将使用
std::transform(a.begin(),a.end(),a.begin(),::toupper);
执行转换或
std::transform(a.begin(),a.end(),b.begin(),::toupper)
说真的。我以为我们只是在修改OP的源代码,所以我想我会加上一些注释使它更现代:P@Tuan333那么还有其他的现代方法吗?请你告诉我?我对C++是新的。
$ ./a.out 
play clash royale

$ 
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
   string a;
   getline(cin,a);
   string b;
   b.resize(a.size());
   for(int i1=0; i1 < a.size();i1++)
   {
      if(a[i1]!='\0')
          b[i1]=(char)toupper(a[i1]);
      else
      {
          b[i1]='\0';
          break;
      }
   }
   cout << b <<endl;
}