好的,以下是我遇到问题的代码部分:
char * historyArray;
historyArray = new char [20];
//get input
cin.getline(readBuffer, 512);
cout << readBuffer <<endl;
//save to history
for(int i = 20; i > 0; i--){
strcpy(historyArray[i], historyArray[i-1]); //ERROR HERE//
}
strcpy(historyArray[0], readBuffer); //and here but it's the same error//
我收到的错误是:
"invalid conversion from 'char' to 'char*'
initializing argument 1 of 'char* strcpy(char*, const char*)'
该项目是创建一个psudo OS Shell,它将捕获和处理中断以及运行基本的unix命令。我遇到的问题是我必须将过去的20个命令存储到在堆栈上动态分配的字符数组中。 (还要取消分配)
当我只使用2d字符数组时,上面的代码工作正常:
char historyArray[20][];
但问题是它不是动态的......
是的,我确实知道strcpy应该用于复制字符串。
非常感谢任何帮助!
答案 0 :(得分:7)
historyArray
指向20 char
s数组的(第一个元素)。您只能在该数组中存储一个字符串。
在C中,您可以创建一个char**
对象,并将其指向char*
个对象数组的第一个元素,其中每个元素都指向一个字符串。这就是argv
的{{1}}参数。
但是既然你正在使用C ++,那么使用main()
vector
并使库为你做内存管理会更有意义。
答案 1 :(得分:1)
两种解决方案。第一个是如果你出于某种原因真的想要数组,那么另一个更推荐使用std::string
更多的“C ++”。
char * historyArray[20]; // Create an array of char pointers
// ...
historyArray[i] = new char[SIZE]; // Do this for each element in historyArray
然后,您可以对strcpy
中的元素使用historyArray
。
我推荐的第二个解决方案是推荐的(我已经解决了其他一些问题):
string historyArray[20];
getline(cin, readBuffer); // Make readbuffer an std::string as well
cout << readBuffer << endl;
for(int i = 19; i > 0; i--){ // I think you meant 19 instead of 20
historyArray[i] = historyArray[i-1];
}
historyArray[0] = readBuffer;
答案 2 :(得分:1)
在C ++程序中停止使用C语言:
std::deque<std::string> historyArray;
//get input
std::string readBuffer;
std::getline(std::cin, readBuffer);
std::cout << readBuffer << std::endl;
//save to history
historyArray.push_front(readBuffer);
if(historyArray.size() > 20)
historyArray.pop_back();
因此,我们有:
答案 3 :(得分:0)
错误1:您正在索引数组边界,并且我被设置为20。
错误2:historyArray [i]是char,而不是char *。你需要&amp; historyArray [i]。
答案 4 :(得分:0)
strcpy(&historyArray[i], &historyArray[i-1]);
数组表示法在strcopy需要指针时提供引用。将引用转换为带有地址(&amp;)运算符的指针。
答案 5 :(得分:0)
historyArray [i]是一个char。这是一个单一的角色。你想要使用刺痛。您的基本问题是historyArray是char*
,这意味着它指向包含字符的内存范围。您希望它是char**
,它是指向字符串指针的指针。您的初始化代码将是
char** historyArray;
historyArray = new char* [20];
for (int i = 0; i < 20; i++)
{
historyArray[i] = new char [512]; //Big enough to have a 512 char buffer copied in
}
答案 6 :(得分:0)
char * historyArray;
historyArray = new char [20];
//get input
cin.getline(readBuffer, 512);
cout << readBuffer <<endl;
//save to history
for(int i = 20; i > 0; i--){
strcpy(&(historyArray[i]), &(historyArray[i-1])); //ERROR HERE//
}
strcpy(historyArray, readBuffer); //and here but it's the same error//
但这只会修复编译器错误,而不是代码中的逻辑错误。你使用C ++这样的字符串解决方案:
vector<string> history;
cin.getline(readBuffer,512);
history.push_back(readBuffer);
或者,如果你想要一个包含readBuffer:
中所有内容的长字符串string history;
cin.getline(readBuffer,512);
history = history += string(readBuffer);
例如......