如何将char附加到std :: string?

时间:2009-09-24 14:26:10

标签: c++ string

以下错误导致错误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 char to char ptr”,“char ptr to char array”等等。

13 个答案:

答案 0 :(得分:189)

y += d;

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

答案 1 :(得分:54)

使用push_back()

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

答案 2 :(得分:17)

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

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

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

s.append(1, d);

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

或者最简单的方法:

s += d;

答案 3 :(得分:9)

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

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

答案 4 :(得分:7)

我通过将它们运行到一个大循环来测试几个命题。 我使用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'

<强>结论

+=似乎更容易理解,但如果你关注速度,请使用追加

答案 5 :(得分:6)

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

此帖子中的链接还包含如何使用相应API的示例。

答案 6 :(得分:2)

问题:

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

是你必须得到'd'而不是使用char的名字,比如char d ='d';或者我错了吗?

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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);

答案 9 :(得分:0)

str.append(10u,'d'); //appends character d 10 times

注意我写了 10u 而不是10我想要追加该字符的次数;用任何数字替换10。

答案 10 :(得分:0)

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

我只是添加了另一个std::string Slist;,然后将新字符串设置为等于字符“ list”的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());

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

答案 11 :(得分:0)

还添加了插入选项,如前所述。

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

答案 12 :(得分:-1)

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