2015-10-18 413 views
0
#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之後的所有字符附加到我的字符串testC++將一個字符從一個字符串追加到另一個字符串

在位置#1,如果我不把&跡象,會有編譯錯誤:

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];成功?

在此先感謝。

+0

又一個「我沒看過文檔」的問題。這個世界有什麼問題? * downvotes和哭泣* –

回答

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

因爲沒有std::basic_string::append()重載需要一個字符。親自看看here

基本上,std::basic_string::append()不是爲字符串的後面添加單個字符而是字符。 std::basic_string::push_back()是專爲此目的而設計的。或者,您可以使用適用於單個字符和字符的operator +

cppreference,每個功能的描述是(重點煤礦):

  • append():追加字符到端
  • push_back():追加字符到端
  • operator + :連接兩個字符串或一個字符串和一個字符
0

label[3]將返回一個字符(結構上來說,它的引用),但不幸的是std::string沒有函數append需要一個字符。

test.append('a');也失敗。

std::stringoperator+=需要一個字符,所以test += label[3];成功。

+0

其實,它是'operator +'。 'std :: basic_string'沒有'operator + ='過載。 – Lingxi

+0

@Lingxi [N3337](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)說'basic_string'有'basic_string&operator + =(charT c); '(21.4.6.1 basic_string :: operator + =) – MikeCAT

+0

是的。感謝您的更正。 – Lingxi