从键盘输入到2d动态数组

时间:2014-05-12 21:17:28

标签: c++ arrays dynamic-arrays

所以我试图编写一个可以从键盘输入并将其存储在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]);
}

2 个答案:

答案 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);
  }
}

更新或为何您的C ++教师出错:

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. 你需要三指针才能通过引用传递二维数组并正确填充(OMG !!!)。
  2. 用户只能输入有限长度的字符串(例如99)不要忘记字符串末尾有一个字符(即'/ 0'为空字符)。
  3. 您必须处理以后分配和删除的内存,以避免内存泄漏。
  4. 如果你想用脚射击自己继续像这样编程。

答案 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让您的生活轻松。