【问题标题】:How to append a char to a std::string?如何将字符附加到 std::string?
【发布时间】:2023-03-06 13:14:01
【问题描述】:

以下失败,错误为prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

int main()
{
  char d = 'd';
  std::string y("Hello worl");
  y.append(d); // Line 5 - this fails
  std::cout << y;
  return 0;
}

我也尝试了以下方法,它可以编译但在运行时随机运行:

int main()
{
  char d[1] = { 'd' };
  std::string y("Hello worl");
  y.append(d);
  std::cout << y;
  return 0;
}

对不起这个愚蠢的问题,但我已经在谷歌上搜索过,我看到的只是“char array to char ptr”、“char ptr to char array”等。

【问题讨论】:

  • 编译器错误是的..我忘记了错误是什么,但这是合理的。
  • 你在下面有更好的答案,但你可以让你的第二个例子像这样工作 char d[2] = {'d', 0};或者只是 char d[2] = "d";基本上,您需要一个 0 来终止您传递给 append 的 c 样式字符串
  • 这里有很好的文档:sgi.com/tech/stl/basic_string.html

标签: c++ string


【解决方案1】:

还添加了插入选项,尚未提及。

std::string str("Hello World");
char ch;

str.push_back(ch);  //ch is the character to be added
OR
str.append(sizeof(ch),ch);
OR
str.insert(str.length(),sizeof(ch),ch) //not mentioned above

【讨论】:

    【解决方案2】:

    我找到了一个简单的方法... 我需要将char 附加到正在动态构建的字符串上。我需要char list;,因为我给用户一个选择,并在switch() 语句中使用该选择。

    我只是添加了另一个 std::string Slist; 并将新字符串设置为等于字符“列表”-a、b、c 或最终用户选择的任何内容,如下所示:

    char list;
    std::string cmd, state[], Slist;
    Slist = list; //set this string to the chosen char;
    cmd = Slist + state[x] + "whatever";
    system(cmd.c_str());
    

    复杂性可能很酷,但简单性更酷。恕我直言

    【讨论】:

      【解决方案3】:

      我通过将几个命题运行到一个大循环中来测试它们。 我使用 microsoft visual studio 2015 作为编译器,我的处理器是 i7、8Hz、2GHz。

          long start = clock();
          int a = 0;
          //100000000
          std::string ret;
          for (int i = 0; i < 60000000; i++)
          {
              ret.append(1, ' ');
              //ret += ' ';
              //ret.push_back(' ');
              //ret.insert(ret.end(), 1, ' ');
              //ret.resize(ret.size() + 1, ' ');
          }
          long stop = clock();
          long test = stop - start;
          return 0;
      

      根据这个测试,结果是:

           operation             time(ms)            note
      ------------------------------------------------------------------------
      append                     66015
      +=                         67328      1.02 time slower than 'append'
      resize                     83867      1.27 time slower than 'append'
      push_back & insert         90000      more than 1.36 time slower than 'append'
      

      结论

      += 似乎更容易理解,但如果您介意速度,请使用 append

      【讨论】:

      • 要使这样的答案有意义,您至少应该告诉您使用的是什么编译器,因为这些事情可能会有很大差异。介绍您的处理器也很重要,可以粗略估计这可能产生的实际影响。
      • 我用的是visual studio 2015。我会找gcc做一些其他的测试。我的处理器是i7,8心,2.20 Ghz....但是不管我的处理器是什么,它都不会影响std::string 实现...除非其中一些方法是多线程的,而另一些不是。
      • 有时它会产生影响,尤其是当您以毫秒为单位显示时间时。相反,您可以显示相对于最快方法的百分比(因此实际处理器速度无关紧要)还将该数据从评论移动到您的答案,这只是一般的 StackExchange 礼仪。否则很好的答案。
      【解决方案4】:

      尝试使用 d 作为指针 y.append(*d)

      【讨论】:

      • 这很危险,因为单个 char 不是字符串,也没有空终止符。这样做会导致未定义的行为。
      • 这是错误的。 *d 表示取消引用指针 d 这是一个语法错误,因为 d 不是指针。
      【解决方案5】:
      str.append(10u,'d'); //appends character d 10 times
      

      请注意,我已经写了 10u 而不是 10 次,因为我想附加字符;用任何数字替换 10。

      【讨论】:

        【解决方案6】:
        int main()
        {
          char d = 'd';
          std::string y("Hello worl");
        
          y += d;
          y.push_back(d);
          y.append(1, d); //appending the character 1 time
          y.insert(y.end(), 1, d); //appending the character 1 time
          y.resize(y.size()+1, d); //appending the character 1 time
          y += std::string(1, d); //appending the character 1 time
        }
        

        请注意,在所有这些示例中,您都可以直接使用字符文字:y += 'd';

        你的第二个例子几乎会起作用,原因不相关。 char d[1] = { 'd'}; 不起作用,但 char d[2] = { 'd'};(注意数组大小为 2)的工作方式与 const char* d = "d"; 大致相同,并且可以附加字符串文字 y.append(d); .

        【讨论】:

          【解决方案7】:

          问题:

          std::string y("Hello worl");
          y.push_back('d')
          std::cout << y;
          

          是你必须有'd'而不是使用一个char的名字,比如char d = 'd';还是我错了?

          【讨论】:

          • 我刚试了一下,效果很好。我有char c = 'd',我可以毫无问题地做y.push_back(c)。所以std::string::push_back()没有问题(除了比+=长)。
          【解决方案8】:

          要使用 append 方法将 char 添加到 std::string var,您需要使用此重载:

          std::string::append(size_type _Count, char _Ch)
          

          编辑: 你说得对,我误解了上下文帮助中显示的 size_type 参数。这是要添加的字符数。所以正确的调用是

          s.append(1, d);
          

          不是

          s.append(sizeof(char), d);
          

          或者最简单的方法:

          s += d;
          

          【讨论】:

          • 我认为在这里使用 sizeof 在语义上是不正确的(尽管它恰好可以工作,因为 sizeof(char) 总是一个)。如果你想追加更多相同字符的副本,append 方法自然更有用!!!!!!!!!
          • 你为什么用sizeof(char)而不是1?你想添加一个重复的d,所以就这么说吧。在这里使用sizeof 会产生误导,因为它表明必须告诉append 所用数据类型的字节大小(事实并非如此)。
          • 正如Unclebens所说,多次添加同一个字符时,append方法确实更有用。
          • append() 不能用于附加操作要求的单个字符。
          【解决方案9】:

          如果您使用的是 push_back,则无需调用字符串构造函数。否则它将通过强制转换创建一个字符串对象,然后将这个字符串中的字符添加到另一个字符串中。一个小角色太麻烦了;)

          【讨论】:

          • 运算符 +=(char c);为字符串重载。事实上,字符串构造函数不接受一个字符,请参阅 Brian 回答 ;)
          【解决方案10】:

          除了提到的其他之外,其中一个字符串构造函数采用一个 char 和该 char 的重复次数。 所以你可以用它来附加一个字符。

          std::string s = "hell";
          s += std::string(1, 'o');
          

          【讨论】:

          • 这在任何其他方面都比+=push_back() 更快也更好。
          【解决方案11】:

          试试 += 运算符link text, append() 方法link text, 或 push_back() 方法link text

          本文中的链接还包含如何使用各个 API 的示例。

          【讨论】:

            【解决方案12】:
            y += d;
            

            我会使用+= 运算符而不是命名函数。

            【讨论】:

            • 为什么你认为 += 比 push_back 更好?是打字少了还是有其他原因?
            • 打字少了。在gcc 中,basic_string::operator+= 只是在push_back 中的一个调用。
            • 字符串更自然的 IMO。 push_back 是容器函数,而字符串是 STL 中的专用函数 :)
            • 让我们把这个问题转过来:为什么你认为 push_back 比 += 更好?在我看来,+= 简洁明了。
            • 你要小心这个,因为如果你养成了这个习惯,如果ychar*而不是std::string,这将编译得很好。它会将 d 字符添加到指针 y 中。
            【解决方案13】:

            使用push_back():

            std::string y("Hello worl");
            y.push_back('d')
            std::cout << y;
            

            【讨论】:

              猜你喜欢
              • 2018-01-12
              • 2012-05-17
              • 1970-01-01
              • 2012-06-15
              • 1970-01-01
              • 2016-09-01
              相关资源
              最近更新 更多