【问题标题】:How to assign char to string object in c++?如何将char分配给c ++中的字符串对象?
【发布时间】:2017-08-26 04:00:33
【问题描述】:

我正在尝试通过将单个字符分配给这样的字符串来将字符串转换为大写字母字符串:-

#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.out 运行 a.out 时,只有 endl 得到打印

这里是示例运行:-

$ ./a.out 
play clash royale

$ 

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

【问题讨论】:

  • 测试a并分配b
  • @GillesGouaillardet 的意思是???
  • 尝试在反转字符串后显示(cout &lt;&lt; b &lt;&lt;endl;)。然后如果它工作检查循环和条件
  • int i=(a.size()),i1=0 这个奇怪的东西到底是怎么回事?你甚至不用i
  • b 是一个空字符串,即使在 reserve() 调用之后也是如此。 b.size() == 0 仍然。因此,b[i1] 是任何i1 值的缓冲区溢出。您的程序表现出未定义的行为。

标签: c++ string char toupper


【解决方案1】:

您的程序存在一些问题。主要的可能是string reservestring resize之间的区别。你在你的程序中想要的已经有一个a.size()长度的字符串,所以,使用b.resize(a.size())

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

#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;
}

【讨论】:

  • 如果使用 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); 放入b
  • 是的。我以为我们只是在修改 OP 的源代码,所以我想我会加入一些 cmets 以使其更现代:P
  • @Tuan333 那么有没有其他的现代方式呢?请问你能告诉我吗?我是 C++ 新手
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2015-04-25
  • 2017-01-18
相关资源
最近更新 更多