带有图案或格式的C scanf

时间:2013-11-18 22:41:08

标签: c arrays format scanf

我必须以这种格式或模式将矩阵扫描到动态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。

3 个答案:

答案 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;

}