【问题标题】:C scanf with pattern or format带有模式或格式的 C scanf
【发布时间】:2013-11-20 04:26:32
【问题描述】:

我必须以这种格式或模式将矩阵扫描到大小未知的动态二维数组(使用 malloc):

%d, %d, %d ...

1、2、3 4、5、6 7、8、9

因此,每个连续的行必须与第一行一样长。如果第一行有 8 个整数:

5、6、7、8、5、0、4、5

那么下一行必须包含相同的整数计数..

然后我可以按 CTRL+D 结束标准输入并继续其他计算。

好吧,我真的不知道如何使用 scanf 读取这种格式的动态数组数据并使用它们。我可以 malloc 二维数组并使用它,但我不知道该怎么做。我希望这很容易理解,我很感激任何帮助。

非常感谢你,我为我糟糕的英语感到抱歉.. Nikolas Ch.

【问题讨论】:

    标签: c arrays format scanf


    【解决方案1】:

    scanf 不适合读取换行符有意义的输入(特别是当换行符和空格之间的区别很重要时)。那是因为它对所有空格都一视同仁(通常只是跳过它),空格和换行符之间没有什么不同。

    如果您需要读取换行符有意义的数据(例如,如果您想验证输入的每一行是否具有相同数量的数字,如您所描述的),那么您确实需要读取整行(使用 fgets)然后用 sscanf 从这些行中读取数字。你也许可以使用类似的东西:

    char line[2048];
    int i = 0;
    
    while (fgets(line, sizeof(line), input)) {
        char *p = line;
        int j, l;
        while (sscanf(p, "%d %n", &yourArray[i][j], &l) > 0) {
            j++;
            p += l;
            if (*p == ',') p++; }
        i++; }
    

    【讨论】:

      【解决方案2】:

      您可以使用此代码:

       for (int i = 0; i < column; i++)
       {
           for (int j = 0; j < row; j++)
           {
               scanf("%d", &yourArray[i][j]);
           }
       }
      

      【讨论】:

      • 问题指定行数和列数未知。因此,此代码无法回答问题。
      • 如果我对行和列一无所知,我无法分配内存,仅仅是因为我们不知道需要多少? @karadoc
      • OP 给出了一个提示:每一行都必须和第一行一样长。通过阅读第一行获取有关第一个的信息。使用您从第一行的内容中学到的内容分配 2D,然后重新打开文件,读取每一行,将每个元素解析为新的 2D 数组。
      【解决方案3】:

      关于您的声明:我可以 malloc 二维数组并使用它,但我不知道该怎么做。我不确定您是否在分配二维数字数组时寻求帮助...如果是这样,这是一种为数字数组创建和释放内存的方法。 (这个是为int,但可以很容易地修改为任何数字类型)

      这与其他建议相结合应该可以满足您的需求。

      int ** Create2D(int **arr, int cols, int rows)
      {   
          int space = cols*rows; 
          int    y;
      
          arr   = calloc(space, sizeof(int));
          for(y=0;y<cols;y++)
          {
              arr[y] = calloc(rows, sizeof(int)); 
          }
          return arr;
      }
      
      void free2DInt(int **arr, int cols)
      {
          int i;
          for(i=0;i<cols; i++)
              if(arr[i]) free(arr[i]);
          free(arr);  
      }
      

      像这样使用它:

      #include <ansi_c.h>
      int main(void)
      {
          int **array=0, i, j;
          array = Create2D(array, 5, 4);//get the actual row/column values from reading the file once.
          for(i=0;i<5;i++)
              for(j=0;j<4;j++)
                  array[i][j]=i*j; //example values for illustration
          free2DInt(array, 5);
      
          return 0;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多