C 为矩阵和用户输入动态分配内存

C 为矩阵和用户输入动态分配内存,c,input,matrix,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=(ch

我正在尝试用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]);
intd//矩阵大小
int i,k;//用于循环
字符**mat;//指向char的指针
printf(“\n输入矩阵大小\n”);//X*X矩阵的大小
scanf(“%d”、&d);
mat=(char**)malloc(d*sizeof(char*);

对于(i=0;i这超出了数组的末尾,并导致未定义的行为:

for (i=0;i<d;i++)
    for (k=1;k<=d;k++)       /* this terminating condition */
        mat[i][k]=getchar(); 
请注意,不需要强制转换
malloc()
的返回值(请参阅),并且
sizeof(char)
保证为1。请始终检查输入操作的结果
scanf()
,以确保变量已实际分配:

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

int ch; /* Note that getchar() returns an int, not a char */
while ((ch = getchar()) != '\n' && ch != EOF);
如果用户使用新行字符终止输入的字符串,则在读取字符串时也需要跳过该字符:

for (i=0;i<d;i++)
{
    for (k=0;k<d;k++)
    {
        int ch = getchar();
        if (EOF == ch)
        {
            fprintf(stderr, "Failed to read stdin");
            break;
        }
        mat[i][k]= (char) ch;
    }
    while ((ch = getchar()) != '\n' && ch != EOF);
}

用于(i=0;i我在我的环境中尝试在ubuntu中使用gcc,当我使用getchar向用户请求矩阵字符值时,我遇到的唯一一个关于结束行字符的问题将出现在图片中,因为当用户输入一个字符时,它将按Enter键以请求下一个值作为stdin中的结果缓冲区,\n它将成为第二个input字符。因此,当我输入2时,程序只要求矩阵条目2而不是4。因此,您可以这样做:

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


请参阅k的for循环。它应该是这样的。在您的例子中,您在获取getchar时使用k=1访问不存在的内存,而在打印时使用k=0为什么要使用(k=1;k)的for循环,所以我将其更改为:for(i=0;iFor一件事
getchar()
返回下一个字符,不管它是空格还是换行符(如果您使用的系统喜欢将换行符表示为两个单独的字符,则在某些情况下可能会同时使用这两个字符)。您没有跳过空格或其他非数字字符,也没有验证您阅读的内容是否有意义。我无法使其正常工作。m[0][0]是否位于最上面一行,左边第一行?因为如果我尝试输入字符(mat[0][0])它什么也没做!是的,我更改了代码,现在看起来是这样。你能告诉我如何打印2d数组吗?这和你上面写的一样
for (i = 0; i < d i++)
{
   for ( k = 0; k < d; k++)
   {
        getchar();
        mat[i][k] = getchar();
   }