我必须以这种格式或模式将矩阵扫描到动态2D数组(使用malloc),大小未知:
%d,%d,%d ...
1,2,3 4,5,6 7,8,9
因此,每条连续线必须与第一条线一样长。如果在第一行是8个interegrs:
5,6,7,8,5,0,4,5
然后每个下一行必须包含相同的整数计数..
然后我可以按CTRL + D结束标准输入并继续进行其他计算。
嗯,我真的不知道,如何使用scanf以这种格式读取动态数组数据并使用它们。我可以使用它来malloc 2D数组,但我不知道,如何做到这一点。我希望,这很容易理解,我感谢任何帮助。
非常感谢,对不起我糟糕的英语我很抱歉 Nikolas Ch。
答案 0 :(得分: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++; }
答案 1 :(得分:0)
您可以使用此代码:
for (int i = 0; i < column; i++)
{
for (int j = 0; j < row; j++)
{
scanf("%d", &yourArray[i][j]);
}
}
答案 2 :(得分:0)
关于 你的陈述:我可以使用它来malloc 2D数组,但我不知道,如何做到这一点。我不确定你是否在帮助修改二维数组的数组......如果是这样的话,这里有一种方法可以为一组数字创建和释放内存。 (这个用于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;
}