C 为矩阵和用户输入动态分配内存
我正在尝试用C编写一个代码,它只要求用户输入一个数字,这个数字将用于创建一个矩阵(D*D); 然后插入字符,然后打印 这是我写的: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
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();
}