C++ 从键盘输入到二维动态数组

C++ 从键盘输入到二维动态数组,c++,arrays,dynamic-arrays,C++,Arrays,Dynamic Arrays,所以我正在尝试编写一个函数,从键盘获取输入并将其存储在2d动态数组中。n是行数(尝试使用1-4行),m是每行的字符数(在我的示例中为256)。我已经读了很多关于动态数组和new的使用的书,代码对我来说似乎很好,但是当我尝试输入文本:访问冲突读取位置0x00000000时,我一直遇到这个错误。不知道为什么。请帮忙 void KeyInput (char **string, unsigned int n, unsigned int m) { cout<<endl<<"I

所以我正在尝试编写一个函数,从键盘获取输入并将其存储在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]);
}
void键输入(字符**字符串,无符号整数n,无符号整数m)
{

cout使用字符串向量,利用STL具有的力(使用力,请参见下面的代码):

void键输入(std::vector和str_vec,int const n)
{

std::cout您能提供更多关于访问冲突的信息吗?我尝试了以下代码(Visual Studio 2010,Window 7 Professional),但没有出现错误。请注意,我确实将每行字符数更改为15而不是255,因为我想在不大量键入的情况下测试边界条件

您的函数在我的机器上似乎运行良好,但是使用gets时确实存在潜在的缓冲区溢出,因为它不检查字符串的长度。请记住,GET将为您附加一个空终止符,因此如果您输入的字符正好是255个,则缓冲区将溢出1个字符

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]);
    }
}
void键输入(字符**字符串,无符号整数n,无符号整数m);
int _tmain(int argc,_TCHAR*argv[]
{
char*strArray;
按键输入(&strArray,4,15);
返回0;
}
void键输入(字符**字符串,无符号整数n,无符号整数m)
{
字符串=新字符*[n];
for(无符号整数i=0;i
(也不要理会那些可怕的东西,它们是Windows的特性:)


最后,除非这是作业(或自学练习),按照402的建议去做,使用STL让你的生活更轻松。

我希望我可以。我们必须在任务中使用动态数组。这太荒谬了,我的教授也有这种癖好。告诉他们他们他们完全错了。你有没有试着在输入键后打印主函数中的字符串?我在Win 7 Ultimate上使用VS 2012 Express,我是sta我觉得我或机器都快疯了。在我发布这个问题后,程序开始错误地传递n,所以它创建了n-1行。而且我在代码中从来没有减少它。无论如何,谢谢你检查这个函数。@402起初没有注意到你的更新,现在就试试你的变体。谢谢。
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;
}
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]);
    }
}