动态分配用于矩阵和用户输入的内存

时间:2012-10-23 14:15:46

标签: c input matrix

我正在尝试用C编写一个代码,只是要求用户输入一个数字,用于创建一个矩阵(D * D); 然后插入字符,然后打印它。

这就是我写的:

int d; //matrix size
int i,k; // used for the loops
char **mat; // pointer to a pointer to char

printf("\nenter matrix size\n"); // size of the X*X matrix
scanf("%d",&d);

mat=(char **)malloc(d*sizeof(char *));

for (i=0;i<d;i++)
    mat[i]=(char *)malloc(d*sizeof(char));


printf("enter %d strings with length %d\n",d,d);

for (i=0;i<d;i++)
    for (k=1;k<=d;k++)
    mat[i][k]=getchar();

for (i=0;i<d;i++)
        for (k=0;k<d;k++)
        printf("%c",mat[i][k]);

- 如果我输入d = 3,它会变得怪异并进入无限循环 - 如果我输入5例如它只给我3次输入4个字符而不是4个。

谢谢你!

2 个答案:

答案 0 :(得分:2)

这超出了数组的末尾,导致了未定义的行为:

for (i=0;i<d;i++)
    for (k=1;k<=d;k++)       /* this terminating condition */
        mat[i][k]=getchar(); 

我不确定为什么k从0开始,因为它会跳过正在读取的数组中的第一个字符。改为:;

for (i=0;i<d;i++)
    for (k=0;k<d;k++)
        mat[i][k]=getchar(); 

请注意,转换malloc()的返回值是不必要的(请参阅Do I cast the result of malloc?),sizeof(char)保证为1.始终检查输入操作的结果,{{1} },以确保实际已分配变量:

scanf()

请注意,在调用if (1 == scanf("%d",&d)) { mat = malloc(d * sizeof(char*)); if (mat) { /* ... */ } } 后,输入维度后输入stdin的换行符将保留在stdin。需要跳过此选项以防止干扰后续的scanf()调用。要跳到行尾:

getchar()

如果用户使用换行字符终止输入的字符串,则在阅读字符串时还需要跳过它:

int ch; /* Note that getchar() returns an int, not a char */
while ((ch = getchar()) != '\n' && ch != EOF);

答案 1 :(得分:0)

我在ubuntu中使用gcc在我的环境中尝试过,当我用户输入一个字符时,我要求用户输入矩阵字符值时,我遇到的唯一一个问题就是终结线查看时会出现问题。输入其下一个值的键作为结果\ n stdin中的缓冲区,它将成为第二个输入字符。因此,当我输入2时,程序要求矩阵输入仅为2而不是4。所以为此你可以这样做:

for (i = 0; i < d i++)
{
   for ( k = 0; k < d; k++)
   {
        getchar();
        mat[i][k] = getchar();
   }

}

请参阅k的for循环。它应该是那样的。在您的情况下,您正在使用不正确的k <= d来访问不存在的内存