代码未正确分配到二维数组(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在下面提到的,或者makearray
一个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);