快速免责声明,这是一个人为的例子,旨在模拟我在作业问题中看到的问题。为此,使用字符串是不可能的;我只能按照教师使用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;
}
}
答案 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);