Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代码未正确分配到二维数组(C)_C_Arrays - Fatal编程技术网

代码未正确分配到二维数组(C)

代码未正确分配到二维数组(C),c,arrays,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 = f

好的,我从一个文本文件中读取如下内容:

 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;

   }
#包括
int main(int argc,char*argv[]){
文件*输入文件;
charele[256];
int行,cols,i,j;
inputFile=fopen(argv[1],“r”);
如果(inputFile==0){
printf(“无法打开“%s”\n”,argv[1]);
返回1;
}
fscanf(输入文件,“%d%d”、&行和列);
字符*数组[行][cols];
对于(i=0;i
第一个嵌套循环读取文本文件并将元素指定给二维数组

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

现在,我的输出输出了2D数组的所有元素,但都显示为7(文本文件中的最后一个元素)

如果我在第一个循环中打印出“ele”,它会正确地打印出矩阵中的所有元素,只是它们不会一一进入2D数组


免责声明:我知道我把它们当作字符来读,即使它们是整数。这是有意的。

目前,您正在为
数组中的每个元素(每个元素都是指向-
char
的指针)分配
ele[0]
的地址,这就是为什么它们都作为读入
ele
的最后一个字符串打印出来的原因。它们都指向同一条线


编辑:误解了你的意思,重新措辞了我的回答。很抱歉。

出现了一些错误(小错误)。主要错误是
fscaf
printf
类型与
格式不匹配。无法使用
%s
读取数字数据,希望它是数字数据。要读取有符号字符值,您需要对
fscanf
printf
进行
%hhd
ele
是类型
char
不是
char*
。与
数组
相同。但是,修复这些问题修复了文件中数字的读取和存储

#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;

}
与此相反:

array[i][j] = ele;
这样做:

array[i][j] = strdup(ele);
strdup分配内存,因此在程序结束时,您必须释放该内存。 我假设您希望继续使用字符串,即字符数组来存储值。
如果这不是一个要求,您可以有一个不需要strdup的不同解决方案。

char*array[rows][cols]
应该是
char array[rows][cols](注意,
在编译时是未知的,因此这不是传统的数组。另一种方法是通过分配
指针,然后为每个指针分配
元素来动态分配整个数组。@DavidC.Rankin这样做会导致分段失败(移除指针*)数组[i][j]=strdup(ele);@KHMBH检查我的答案——工作完美:)你真的必须把你的要求说得更清楚。你说“我知道我把它们当作字符来读,即使它们是整数”,这让每个人都陷入了困境。那么我该怎么解决呢?我已经在谷歌上搜索了几个小时,没有什么价值。你可以用
strdup
为每个数组元素分配一个新字符串,就像@philipstuyck在下面提到的,或者make
array
一个
int
s的数组,并用
array[i][j]=atoi(ele)填充它;
取而代之。你为什么要处理矩阵中的字符串?因为它指出了源代码中问题的本质。效果很好,谢谢。介意我扩展一下这个问题吗?这对这种情况很有效,但是如果我的文本文件的字符串大小超过一个会怎么样。例如:数组[0][0]=“1010”,数组[0][1]=“1”。它们由空格和/或制表符分隔。我如何编辑您的代码以使其工作?读取文件的最佳方式是使用面向行的输入方法,如
fgets
getline
。您可以将整行内容读取到缓冲区中。然后可以使用
strtok
strtol
sscanf
将数字输出缓冲区的。(在缓冲区上使用的工具比在读取行时使用的工具更多)。这很简单,一开始让人困惑。好吧,我会开始谷歌搜索。谢谢!你介意我私下给你发一些问题,而不是写一篇新文章吗?你似乎不像我一样精通C语法。改变ele的类型。一个字符对于int来说太小了。输入文件中有500个字符。不,不,我有字符串n C.它们被称为
null-terminated
字符串。它们恰好是
char
类型,因为
ASCII
值都在0和
127
之间。您可以将
char数组
用作传统的行x列数组,也可以将其用作
null-terminated字符串的数组do it
:p
哦,不,你只是
以null结尾的
他的数字数组项。现在有点不清楚要求是什么。你更改了ele类型,我现在是否应该创建一个注释:“哦,不,你更改了ele的类型”?显然这不是问题;-,显然这是个问题。OP需要绳子!
array[i][j] = strdup(ele);