2

好的,这是我遇到问题的代码部分:

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 个命令存储到一个在堆栈上动态分配的字符数组中。(也取消分配)

当我只使用二维字符数组时,上面的代码可以正常工作:

char historyArray[20][];

但问题是它不是动态的......

是的,我确实知道 strcpy 应该用于复制字符串。

任何帮助将不胜感激!

4

7 回答 7

7

historyArray指向 20 chars 的数组(的第一个元素)。您只能在该数组中存储一个字符串。

在 C 中,您可以创建一个char**对象并让它指向char*对象数组的第一个元素,其中每个元素都指向一个字符串。这就是argv参数 tomain()所做的。

vector但是由于您使用的是 C++,因此使用 a of strings 并让库为您进行内存管理会更有意义。

于 2011-09-27T21:33:16.103 回答
1

两种解决方案。第一个是如果你出于某种原因真的想要数组,另一个是更推荐和更多“C++”ish using std::strings。

char * historyArray[20]; // Create an array of char pointers

// ...

historyArray[i] = new char[SIZE]; // Do this for each element in historyArray

然后你可以strcpyhistoryArray.

推荐我重复的第二种解决方案(我已经修复了一些其他问题):

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;
于 2011-09-27T21:35:38.323 回答
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();

结果,我们有:

  • readBuffer / getline() 中没有缓冲区溢出威胁
  • 在任何地方都没有任何指针可以让我们感到困惑。
  • 没有数组超出范围
  • 任意长的输入字符串
  • 经验证的内存分配语义
于 2011-09-27T21:49:34.593 回答
0

错误 1:您在 i 设置为 20 的情况下索引超出了数组边界。

错误 2:historyArray[i] 是 char,而不是 char *。你需要 &historyArray[i]。

于 2011-09-27T21:32:54.117 回答
0
strcpy(&historyArray[i], &historyArray[i-1]);

数组表示法提供引用,而 strcopy 需要指针。使用地址 (&) 运算符将引用转换为指针。

于 2011-09-27T21:33:19.963 回答
0

historyArray[i] 是一个字符。它是单个字符。你想用刺。您的根本问题是 historyArray 是 achar*这意味着它指向包含字符的内存范围。您希望它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
}
于 2011-09-27T21:37:10.977 回答
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);

例如...

于 2011-09-27T21:53:22.903 回答