所以我试图编写一个可以从键盘输入并将其存储在2d动态数组中的函数。 n是行数(尝试1-4行),m是每行的字符数(在我的情况下为256)。我已经阅读了很多关于动态数组的内容,并且使用new和代码似乎对我很好,但是当我尝试输入文本时我不断收到此错误:访问冲突读取位置0x00000000。无法弄清楚原因。请帮忙。
void KeyInput (char **string, unsigned int n, unsigned int m)
{
cout<<endl<<"Input from keyboard"<<endl;
string=new char* [n];
for(unsigned int i = 0; i < n; i++ )
string[i]=new char[m];
for(unsigned int i = 0; i < n; i++ )
gets(string[i]);
}
答案 0 :(得分:0)
使用字符串向量,利用STL所具有的力(使用力卢克看下面的代码如何):
void KeyInput (std::vector<std::string>& str_vec, int const n)
{
std::cout << "\nInput from keyboard" << std::endl;
for (auto i = 0; i < n; i++) {
std::string tmp;
std::getline(std::cin, tmp);
str_vec.push_back(tmp);
}
}
void KeyInput(char ***string, unsigned int n, unsigned int m)
{
std::cout << "\nInput from keyboard" << std::endl;
*string = new char*[n];
for (unsigned int i = 0; i < n; i++)
(*string)[i] = new char[m];
for (unsigned int i = 0; i < n; i++)
std::gets((*string)[i]);
}
int main()
{
char **string = 0;
KeyInput(&string, 4, 100);
for (auto i = 0; i < 4; ++i) std::cout << string[i] << std::endl;
return 0;
}
答案 1 :(得分:0)
您能否提供有关获取访问权限的详细信息?我尝试了以下代码(Visual Studio 2010,Window 7 Professional)并没有收到错误。请注意,我确实将每行的字符数更改为15而不是255,因为我想在没有大量输入的情况下测试边界条件。
你的函数似乎在我的机器上工作正常,但你使用gets确实有一个潜在的缓冲区溢出,因为它没有检查字符串的长度。请记住,gets会为你附加一个null-terminator,所以如果在你的情况下输入正好255个字符,你的缓冲区就会溢出一个。
void KeyInput(char** string, unsigned int n, unsigned int m);
int _tmain(int argc, _TCHAR* argv[])
{
char* strArray;
KeyInput(&strArray, 4, 15);
return 0;
}
void KeyInput(char** string, unsigned int n, unsigned int m)
{
string = new char*[n];
for(unsigned int i = 0; i < n; i++)
{
string[i] = new char[m];
}
for(unsigned int i = 0; i < n; i++)
{
gets(string[i]);
}
}
(也忽略了hideous _tmain和_TCHAR的东西,它们是Windows的特性:))。
最后,除非这是一项作业(或自学习练习),否则请执行40two建议并使用STL让您的生活轻松。