使用 strcpy 从'char'到'char*'的转换无效
invalid conversion from 'char' to 'char*' using strcpy
好的,下面是我的代码中遇到问题的部分:
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*)'
该项目旨在创建一个psudoOSShell,用于捕获和处理中断以及运行基本的unix命令。我遇到的问题是,我必须将过去的20个命令存储到一个在堆栈上动态分配的字符数组中。(也取消分配(
当我只使用一个2d字符数组时,上面的代码运行良好:
char historyArray[20][];
但问题是它不是动态的。。。
是的,我知道strcpy应该用来复制字符串。
如有任何帮助,我们将不胜感激!
historyArray
指向20个char
s的数组(的第一个元素(。在该数组中只能存储一个字符串。
在C中,可以创建一个char**
对象,并使其指向char*
对象数组的第一个元素,其中每个元素都指向一个字符串。这就是argv
参数对main()
的作用。
但由于您使用的是C++,因此使用string
的vector
并让库为您进行内存管理会更有意义。
停止在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((中没有缓冲区溢出威胁
- 没有任何指针,任何地方,来迷惑我们
- 没有可超越的数组
- 任意长的输入字符串
- 经过成功验证的内存分配语义
两个解决方案。第一种是,如果您出于某种原因真的想要数组,那么另一种更推荐使用std::string
s的"C++"风格。
char * historyArray[20]; // Create an array of char pointers
// ...
historyArray[i] = new char[SIZE]; // Do this for each element in historyArray
然后可以在historyArray
中的元素上使用strcpy
。
我重复的第二个解决方案是推荐的(我已经修复了其他一些问题(:
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;
historyArray[i]是一个字符。它是一个单独的字符。你想用刺。您的基本问题是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
}
错误1:索引超过数组边界,i设置为20。
错误2:historyArray[i]是一个字符,而不是字符*。你需要&historyArray[i]。
strcpy(&historyArray[i], &historyArray[i-1]);
数组表示法提供引用,而strcopy需要指针。将引用转换为具有(&(运算符地址的指针。
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);
例如。。。
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串