我正在尝试用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个。
谢谢你!
答案 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来访问不存在的内存