将用户输入复制到char矢量

时间:2011-10-08 02:20:59

标签: c++

快速免责声明,这是一个人为的例子,旨在模拟我在作业问题中看到的问题。为此,使用字符串是不可能的;我只能按照教师使用char数组:(

我要做的是不断从键盘读取输入并将其存储在vector中。问题是,一旦vector函数结束(当我尝试查看它时,我看到addData),我添加到\320\366\277_\377的任何数据都会丢失。我认为这是因为我使用的是vector<char*>,因此vector只能在pointer存在的情况下使用数据。但是,如果我将代码更改为vector<char>,我的代码将无法编译,因为我收到错误cannot convert char* to char

那么,如何将 char数组单个字符)保存到vector元素?或者,是否有更好的方法可以完全避免这个问题呢?

#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;
    }

}

3 个答案:

答案 0 :(得分:1)

使用vector<char>,而不是

vec.push_back(newData);

使用:

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

或者它实际上需要是char数组的向量吗?

答案 1 :(得分: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";
}

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

答案 2 :(得分: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);