2011-10-08 16 views
1

快速免責聲明,這是一個人爲的例子,旨在模擬我在作業問題中看到的問題。爲此,使用字符串是不可能的。我只能根據教師使用字符數組:(將用戶輸入複製到char矢量

我想要做的是不斷從鍵盤讀取輸入並將其存儲在vector。問題是,無論添加到vector的數據是否丟失當addData函數結束時(當我嘗試查看它時,我看到\320\366\277_\377)。我相信這是因爲我使用的是vector<char*>,因此只要pointer存在,vector就只能使用該數據。 ,我的代碼無法編譯,如果我將其更改爲vector<char>,因爲我得到的錯誤說cannot convert char* to char

那麼,如何保存一個字符數組不是單個字符)到一個向量元素?或者,有沒有更好的方法可以避免這個問題呢?

#include <iostream> 
#include <cstring> 
#include <vector> 

using namespace std; 
const int MAX_BUFFER_SIZE = 80; 

// class declaration 
class Example { 
public: 
    void getData(); 
    void addData (char * newData); 
    void displayData(); 

private: 
    vector<char*> vec; 
}; 

// main function 
int main() { 
    bool quitProg; 
    int quit; 
    quitProg = false; 
    Example shoopDaWhoop; // buffers cannot overflow if you shoop da whoop 
    while (!quitProg) { 
     shoopDaWhoop.getData(); 
     shoopDaWhoop.displayData(); 
     cout << "Type 1 if you want to exit... "; 
     cin >> quit; 
     if (quit == 1) { 
      quitProg = true; 
     } 
    } 
    return 0; 
} 

void Example::getData() { 
    char userInput [MAX_BUFFER_SIZE]; 

    cout << "Enter text: "; 
    cin.get(userInput, MAX_BUFFER_SIZE - 1, '\n'); 
    if (cin.fail()) { // data is invalid 
     // clear and reset input stream 
     cin.clear(ios::goodbit); 
     cin.ignore(INT_MAX,'\n'); 
     // alert user they entered bad data 
     cout << "That was bad data!" << endl; 
    } 
    else { 
     // data is good, pass it to addData 
     addData(userInput); 
    } 
} 

void Example::addData (char * newData) { 
    vec.push_back(newData); 
    cout << "You entered: " << vec.back() << endl; 


} 
void Example::displayData() { 
    for (int i=0; i<vec.size(); i++) { 
     cout << "Item " << i << ": " << vec[i] << endl; 
    } 

}

回答

0

使用一個std::vector<std::string>,應該「與你的現有代碼一起工作」。

既然你不能用std::string做到這一點(這將是使用語言的正確方式),將您的嵌套向量,就像這樣:

std::vector<std::vector<char> > vex; // notice the space between the '>' chars, older compilers may need it this way 
addData功能

然後:

std::vector<char> tmp; 

while(*newData) 
    tmp.push_back(*newData++); 

vec.push_back(tmp); 
+0

不幸的是,我不允許在家庭作業中使用'string'。 – Moses

+0

然後執行此操作(請參閱編輯)。避免做你自己的內存管理(除非指定規則要求,否則不要在原始指針中使用'new'。) – Chad

1

圍棋與vector<char>,但不是

vec.push_back(newData); 

用途:

size_t len = strlen(newData); 
vec.insert(vec.end(), newData, newData + len); 

或者它實際上需要字符數組的載體?

+0

我需要向量來存儲char數組,就像你說的,不是一個字符。 – Moses

0

vector<char*>只能容納指針 - 你想讓它保存字符。要顯示文本,您必須遍歷矢量並打印每個字符。

vector<char> vec; 

void Example::addData (char * newData) { 
    cout << "You entered: "; 
    while (*newData) { 
    vec.push_back(*newData); 
    cout << (*newData); 
    ++newData; 
    } 
    cout << endl"; 
} 

如果你想要多個字符串,你可以使用另一個向量。

+0

僅將每個字符存儲到每個向量元素。我試圖將整個char數組存儲到每個向量元素。 – Moses

+0

我相信@ Pubby8建議你可以使用'vector >'。當然,有很多方法*可以*用'new []'和'delete []'或其他方法攻擊這個問題。但很難確切地知道你被允許使用或不允許使用......正如你所說的「字符串是不可能的」,但是你正在使用'vector'! – HostileFork