代码未正确分配给2D数组(C)

时间:2015-05-20 05:29:18

标签: c arrays

好的,我正在阅读一个看起来像这样的文本文件:

 3 4
 2 1 1  1
 6 2 1 -7
-2 2 1  7      

前两个数字是行数和列数。

然后我读入矩阵并想要将值分配给2D数组:

这是我的代码:

#include <stdio.h>

int main( int argc, char *argv[] ) {
     FILE *inputFile;
     char ele[256];
     int rows,cols,i,j;


    inputFile = fopen(argv[1], "r" );

    if(inputFile == 0) {
        printf("Can't open '%s'\n", argv[1]);
        return 1;
    }

    fscanf(inputFile, "%d %d", &rows, &cols);
    char *array[rows][cols];




        for ( i = 0; i < rows; i++ )
        {
          for ( j = 0; j < cols; j++ )
          {
             fscanf(inputFile, "%s", ele);
             array[i][j] = ele;          
            }
         }



    for ( i = 0; i < rows; i++ )
    {
      for ( j = 0; j < cols; j++ )
      {
         printf("array[%d][%d] = %s\n", i,j, array[i][j] );
      }
    }

    return 0;

   }

第一个嵌套循环从文本文件中读取并将元素分配给2D数组。

第二个循环打印出2D数组的所有元素。

现在,我的输出打印出2D数组的所有元素,但将它们全部显示为7(文本文件中的最后一个元素)。

如果我打印出来&#34; ele&#34;在第一个循环中,它正确打印出矩阵中的所有元素,只是它们不会逐个进入2D数组。

免责声明:我知道即使他们正在注意,我也会将其视为字符。这是故意的。

3 个答案:

答案 0 :(得分:2)

有一些错误(小错误)。主要错误是与typeformat的{​​{1}}字符串的fscaf不匹配。您无法使用printf读取数字数据,并希望它是数字数据。要阅读签名字符值,%s%hhd都需要fscanfprintf类型为ele,而非char。与char*相同。但是,修复那些修复了从文件中读取和存储数字的文件。

array

<强>输出

#include <stdio.h>

int main (int argc, char *argv[])
{
    if (argc < 2) {
        fprintf (stderr, "error: insufficient input.  usage:  %s <file>\n", argv[0]);
        return 1;
    }

    FILE *inputFile;
    char ele;
    int rows, cols, i, j;


    inputFile = fopen (argv[1], "r");

    if (inputFile == 0) {
        printf ("Can't open '%s'\n", argv[1]);
        return 1;
    }

    fscanf (inputFile, "%d %d", &rows, &cols);
    char array[rows][cols];

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            fscanf (inputFile, "%hhd", &ele);
            array[i][j] = ele;
        }
    }

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            printf ("array[%d][%d] = %hhd\n", i, j, array[i][j]);
        }
    }

    return 0;

}

答案 1 :(得分:1)

按照目前的情况,您要将array中的每个元素(每个元素都指向char)指定为ele[0]的地址,这就是为什么它们是所有打印出来都是您读入ele的最后一个字符串。他们都指向同一个字符串。

编辑:误解了你的内容,重新回复了我的回复。抱歉'回合那个。

答案 2 :(得分:0)

而不是:

std::advance(it, a.size());

这样做:

    static void Main(string[] args)
    {
        Console.Title = "Quadrado Mágico";
        Console.BackgroundColor = ConsoleColor.DarkCyan;
        Console.Clear();
        Console.ForegroundColor = ConsoleColor.DarkBlue;
        Random ran = new Random();
        Console.Clear();

        const int f = 3;
        const int c = 3;

        int[,] quadrado = new int[f, c]
        {
            {0, 0, 0}, {0, 0, 0}, {0, 0, 0}
        };

        for (int fila = 0; fila < f; fila++)
        {
            for (int coluna = 0; coluna < c; coluna++)
            {
                Console.WriteLine(quadrado[fila, coluna] + "\t");
            }
            Console.WriteLine();
        }


        Console.ReadKey();
    }

strdup分配内存,所以在程序结束时你必须释放那个内存。 我假设你想继续使用字符串,即char数组来存储值。 如果这不是一项要求,您可以使用不需要strdup的不同解决方案。