c ++将字符串中的一个字符附加到另一个字符串

时间:2015-10-18 13:59:11

标签: c++ string

#include <string>
#include <iostream>

int main()
{
    std::string test("hello world ");
    std::string label("label test");
    test.append(&label[3]);    //----- #1
    std::cout << test << std::endl;
}

对于上面的代码,我所期待的是“hello world e”,但事实上,它的输出是“hello world el test”。它将位置3之后的所有字符附加到我的字符串test

在#1位置,如果我没有把&amp;签名,会有编译错误:

str_append.cpp:10:10: error: no matching member function for call to 'append'
    test.append(label[3]);
    ~~~~~^~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1516:19: note: candidate function not viable: no known conversion
      from 'value_type' (aka 'char') to 'const value_type *' (aka 'const char *') for 1st argument; take the address of the argument with &
    basic_string& append(const value_type* __s);
                  ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1513:19: note: candidate function not viable: no known conversion
      from 'value_type' (aka 'char') to 'const std::__1::basic_string<char>' for 1st argument
    basic_string& append(const basic_string& __str);
                  ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1525:9: note: candidate function template not viable: requires 2
      arguments, but 1 was provided
        append(_InputIterator __first, _InputIterator __last);
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1532:9: note: candidate function template not viable: requires 2
      arguments, but 1 was provided
        append(_ForwardIterator __first, _ForwardIterator __last);
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1515:19: note: candidate function not viable: requires 2
      arguments, but 1 was provided
    basic_string& append(const value_type* __s, size_type __n);
                  ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1517:19: note: candidate function not viable: requires 2
      arguments, but 1 was provided
    basic_string& append(size_type __n, value_type __c);
                  ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:1514:19: note: candidate function not viable: requires at least 2
      arguments, but 1 was provided
    basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
                  ^
1 error generated.

我能解决这个问题的唯一方法是将#1行更改为:

test += label[3];

所以,我想知道这背后的逻辑是什么? label[3]无法返回单个字符吗?当我使用test.append(label[3]);时失败的原因。为什么test += label[3];成功?

提前致谢。

3 个答案:

答案 0 :(得分:2)

你不是附加一个角色;你附加一个C字符串。该C字符串由指针&label[3]提供,指针指向以下数据:{'e','l',' ','t','e','s','t','\0'}

要追加角色,您只需传递label[3]。但是,要执行此操作,您需要使用basic_string& append(size_type count, CharT ch)或其方便的等效内容(count==1时),void push_back(CharT ch)

operator+=在功能上与push_back类似,这就是为什么它在您尝试时有效。

所以:

#include <string>
#include <iostream>

int main()
{
    std::string test("hello world ");
    std::string label("label test");

    test.append(1, label[3]);  // or...
    test.push_back(label[3]);  // or...
    test += label[3];

    std::cout << test << std::endl;
}

简而言之,阅读文档以了解成员std::string的含义以及如何使用它们。

答案 1 :(得分:1)

因为没有std::basic_string::append()重载需要一个字符。亲眼看看here

基本上,std::basic_string::append()并非旨在将单个字符添加到字符串的后面,而是添加字符。 std::basic_string::push_back()专为此目的而设计。或者您可以使用适用于单个字符和字符的operator +

cppreference上,每个函数的描述都是(强调我的):

  • append():将字符添加到结尾
  • push_back():将一个字符添加到结尾
  • operator +:连接两个字符串或一个字符串和一个char

答案 2 :(得分:0)

label[3]将返回一个字符(从结构上讲,它是对它的引用),但不幸的是std::string没有一个带有一个字符的函数append

test.append('a');也失败了。

std::stringoperator+=,其中包含一个字符,因此test += label[3];成功。