【问题标题】:How to store rows of chars from the user input to a dynamically allocated jagged 2d char array in C/C++?如何将用户输入的字符行存储到 C/C++ 中动态分配的锯齿状二维字符数组中?
【发布时间】:2021-06-03 03:35:19
【问题描述】:

假设 char 的每一行都以“E”字符结尾,最后一行以“T”字符结尾。我正在努力打印出用户给出的字符行,不包括终止字符。

    必须使用 malloc()、calloc()、realloc() 和 free() 函数之一。

示例输入和输出可能是这样的:

Input Output
A B C E
V F E
K T
A B C
V F
K

我的尝试:

#include <iostream>
#include <sstream>
#include <string>
#include <math.h> 
#include <vector>
#include <stdio.h> 

using namespace std;


int main()
{

   char c;
   int rowsize = 0 ,colsize = 0;
   char** chararr; 
   chararr = (char**)malloc(sizeof(char*));



   vector<int> colsizes;

   char chars[20];

   do {

       cin >> c;
       
       
        colsize++;

        for(int i=0; i<colsize;i++) {
            chars[i] = c;
        }
 


       if ( c ==  'E') { 
           

           ++rowsize;
           colsizes.push_back(colsize);


            chararr = (char**)realloc(chararr,rowsize*sizeof(char*));

            for (int i = 0; i < rowsize; ++i){
            *(chararr + i) = (char*)malloc(colsizes[i] * sizeof(char));
    
            for (int j = 0; j < colsizes[i]; ++j) {

              chararr[i][j] = chars[j];
            
             }
        }


           colsize = 0 ;

           continue;       
       }

   }while(c != 'T');

    colsizes.push_back(colsize);


 for (int i = 0; i < rowsize; ++i){
    
        for (int j = 0; j < colsizes[i]; ++j) {

             std::cout << chararr[i][j] << " ";
            
             }

             std::cout << endl;
        }
}

【问题讨论】:

  • 您应该选择一种语言。普通 C 解决方案将本机使用 alloc 系列,普通 C++ 解决方案应使用向量。 IHMO,如果非要使用alloc,最好用C...不过目前的代码是C++,没有使用malloc...
  • 奇怪的是你不得不使用 malloc 系列函数,因为 C++ 有更合适的函数 new/delete 和 new[]/delete[]使用起来更安全(因为它们不只是分配内存)
  • 你在这门课上学的是C还是C++?这些是不同的语言。

标签: c++ arrays c dynamic-memory-allocation jagged-arrays


【解决方案1】:

这是您可以使用的一种 c++ 方式,

  string line;

  while (getline(cin, line)) {
    stringstream str(line);
    string word;
    while (str >> word) {
      if (word == "E") {
        break;
      }
      cout << word << " ";
    }
    cout << endl;
  }

【讨论】:

    【解决方案2】:

    这里是 CPP 的另一种方式,这种方式你需要逐个字母输入,最后打印出来,如果你一次得到整行,将 while 循环更改为 std::getline()

    #include <iostream>
    #include <vector>
    
    int main()
    {
        char c;
        std::vector<char> vec;
        while(c != 'T')
        {
            std::cin >> c;
            vec.push_back(c);
            
        }
        
        for(auto& c : vec)
        {
            if(c == 'E')
            {
                std::cout << "\n";
            } else 
            {
                std::cout << c << " ";
            }
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您的代码是 C++ 和 C 的混合体。所以我将继续假设它是 C++。我将编写 C++ 建议,然后是 C 风格的实现备注。

      vector<vector<char>> v; 
      do {
      v.push_back(vector<char>{}); 
      do {
         cin >> c; 
         v.push_back(c);
      } while(c != 'E' && c != 'T');
      } while(c != 'T');
      
      for(std::size_t i = 0; i<v.size(); i++) { for(std::size_t j = 0; j<v[i].size() - 1; j++) {std::cout << v[i][k] << " "} }
      

      这是一个丑陋的 C++ 解决方案,预计可以工作。 j&lt;v[i].size() - 1 跳过终止字符。

      现在,malloc 和 free 是强制性的,这意味着这个作业应该用 C 风格编写。不要使用向量,向量是C++ not C. 的一部分,我们需要用 C 风格编写。由于这是您的作业,因此我不会发布整个解决方案,但是,我会提出一些意见以帮助您实现目标。

      逻辑

      您的代码中的第一个问题是

          colsize++;
          for(int i=0; i<colsize;i++) {
              chars[i] = c;
          }
      

      这将覆盖读取最后一个字符的行,在您的情况下,E 表示每一行。这将变成:

          chars[colsize] = c;
          colsize++;
      

      Malloc

      我们必须将您的字符存储在我们动态分配的矩阵中(我们不能使用向量)。您的矩阵 chararray 未正确分配。这将导致很多头痛。以下是错误的

      int rowsize = 0, colsize = 0;
      char **chararr;
      chararr = (char **)malloc(sizeof(char *));
      

      这就是你的做法:

      scanf("%d %d", &r, &c); 
      char** chararr = malloc(sizeof(char*) * r); 
      for (i = 0; i < r; i++) 
      chararr[i] = malloc(c);
      

      免费

      现在您的字符矩阵已分配。由于它是动态分配的,我们需要手动释放它。永远记住,如果你的代码中有 n 个 malloc,你期望有 n 个 frees。所以,没有内存泄漏。释放矩阵的方式与分配矩阵的方式相反。为什么?我们需要按照我们分配它们的方式为每一行释放它的底层指针。

         

      for (i = 0; i < r; i++)
              free(chararr[i]);
               
      free(chararr);
      

      【讨论】:

      • 代码中的 r 和 c 是什么?我认为这意味着它的行和列大小。我不想从用户那里扫描这些号码。该程序应该只扫描字符并手动计算每行的 col 大小。
      • 然后你必须重新分配你的增长,这使它成为一个不同的问题。
      猜你喜欢
      • 2018-07-14
      • 2017-03-11
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多