2011-11-10 43 views
1

它看起來像當我cout * cp時,它只輸出字符串的第一個字母,並且在將它們放入向量之後,我的輸出爲空。我究竟做錯了什麼?char *到字符串向量的列表

//write a program to assign the elements from a list of char* pointers to c-style character strings to a vector of strings 
#include <iostream> 
#include <cstring> 
#include <vector> 
#include <list> 
#include <string> 
using namespace std; 
int main() 
{ 
    list<const char*> clist; 
    cout<<"please enter a string"<<endl; 
    for(string s; getline(cin,s);) 
    { 
     const char* cp=s.c_str(); 
     clist.push_back(cp); 
     cout<<*cp; 
    } 
    cout<<*clist.begin(); 
    vector<string> svec; 
    svec.assign(clist.begin(),clist.end()); 
    for(vector<string>::iterator iter=svec.begin(); iter!=svec.end(); ++iter) 
     cout<<*iter<<endl; 
return 0; 
} 
+1

http://codereview.stackexchange.com而不是標記,雖然這不是一個真正的CR問題 –

+1

'COUT << * CP;',當你提領了'cp'變量(使用'*'運算符),你從你的字符串得到一個單一的字符。因此,爲了打印整個字符串,你甲肝e傳遞實際的指針,例如:'cout << cp;'。然而,你應該使用'std :: string'而不是*裸指針*。 – jweyrich

+2

是什麼讓你知道你應該使用指針?如果你不熟悉C++,你可能會考慮這個僞規則:「如果你使用的是指針,那麼你就是在做錯了。」 –

回答

6

這將打印整個字符串:

cout << cp; // You're providing cout a const char * 

這將只打印一個字符:

cout << *cp; // You're providing cout a char 

至於什麼地方錯了你的載體,你只存儲指向字符串,而不是字符串。字符串的內存已經超出了範圍。正如其他人所說,使用std::string而不是原始const char *

+0

哦對。那如果我想的char *的分配給串 – ihm

+0

的矢量我只想使用字符串底部。這只是書中的一個問題。我想弄清楚如何將一個char *列表分配給一個字符串向量。 – ihm

4

COUT * CP,它僅輸出串

井的第一個字母,*cp是一個字符(一個在位置發現該指針cp指針)。所以,是的,它會的。

我把他們之後在載體,我的輸出是空白

這是不幸的,你的程序沒有徹底崩潰,在列表中的指針幾乎只要你存儲它們成爲懸擺指針。

商店std::string從一開始。

+0

我想有字符的列表*第一,然後分配這些C風格字符串串 – ihm

+0

@ihm的載體:爲什麼呢?這是荒謬的。不要這樣做。 –

+0

他們爲什麼成爲懸掛?如果它很煩,我很抱歉。 – ihm

2
cout<<*cp; 

將輸出一個字符,因爲它指向一個const char *

你需要做的:

cout<<cp; 

這將輸出由cp指出整個字符串。

1

它看起來就像當我清點* CP,只輸出字符串

*cp的第一個字母是字符串的第一個字母。 cout << cp將打印整個字符串。

我把它們放在向量中後,我的輸出是空白的。

您的列表包含指向s內容的指針,該內容僅在循環體內有效。一旦該字符串超出範圍,指針就是「懸掛」 - 指向釋放內存。試圖使用指針會導致未定義的行爲。

你需要,無論是通過使clist一個list<string>,或通過保持在另一個容器中的字符串,並在clist該容器中存儲指向該數據保持保持串本身的副本。

或者,你可以使用字符串文本而不是讀字符串從cin。字符串文字與程序一樣長,因此懸掛指針沒有問題。

(假設你的代碼的第一行中的註釋是一個你不能改變的規範,否則我會完全清除clist,並且當我閱讀時將每個字符串推到svec的背面它,它是很少使用指針任何一個好主意。)

+0

這不是一個家庭作業。我正在讀一本書,這是本書中的一個問題。我明白他們爲什麼現在變得懸崖峭壁。除了有另一個字符串容器並且指針指向它們中的每一個。有沒有更好的辦法?如果可能的話 – ihm

+0

@ihm:你可以使用字符串文本而不是從'cin'讀取字符串:'clist.push_back(「你好!」);'會的工作,沒有懸擺指針的問題。但是如果你需要創建並保持一串字符串,那麼沒有什麼比字符串容器更好的了。 –

+0

謝謝。這非常有幫助。順便說一句。在linux中編寫代碼的好的txt編輯器是什麼?我正在使用gedit。但由於某種原因它變得非常慢。 – ihm

1

在這裏你有幾個大的問題。首先,

const char* cp=s.c_str(); 

返回一個指向std :: string內部成員字符串的指針。當你改變字符串時,返回的指向c_str的指針引用的值可能會改變(甚至可能在新的位置)。所以,你列表中的值是無效的。請確保您不使用c_str並嘗試使用結果的原始字符串已經改變之後,(除非你複製c_str結果到一個新的字符數組。

此外,

cout<<*cp; 

只打印我們的第一個元素,擺脫*打印整個c字符串在這個列表元素上

+0

謝謝我會記住他們。 – ihm