我想从用户那里接收一个矩阵,就像下面的例子
6 5
*###**
##***#
##*###
##*###
#**###
这是我的代码:
#include <stdio.h>
int main()
{
int n, m;
scanf("%d %dn", &n, &m);
char list[n][m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%c", &list[i][j]);
}
}
for(int i=0;i<n;i++)
{
for(int j =0;j<m;j++)
{
printf("%c",list[i][j]);
}
}
return 0;
}
而不是我给它的输入,它给我的输出如下
*###**
##***#
##*###
##*###
#*
我认为问题是每行后的空格被保存为一个字符。有人能帮我吗?
这里有几个问题。
-
当你认为你的输入可能是一个6x5矩阵,C没有这样的概念,它只知道数组的维度,它是程序员必须定义哪个维度对应于什么。也就是说,您可以选择
char list[n][m];
或char list[m][n];
。由于您每行读取6个字符,并且从对应于数组最右边维度的内循环中读取,因此您要么必须输入
5 6
,要么将数组更改为[m][n]
。 -
scanf
在用户按回车时在stdin
中留下新的n
行字符。这些必须被读取或丢弃。%d
输入忽略它们,因为它们不是数字,但%c
读取它们。这是每个学习C语言的人都会遇到的问题,请参阅scanf()将换行符留在缓冲区中。您的输出看起来很奇怪的原因是因为循环中的
scanf("%c"
一直读取'n'
字符并将它们存储在数据中。但那里没有地方存放它们。由于4读n
被存储在数据中,因此最终缩短了4个字符。然后循环在所有实际数据被读取之前结束。
至于如何修复它,最好的解决方案是忘记您曾经听说过scanf
,而使用fgets
代替。学习控制台I/O和stdio.h
的所有细节通常是不值得花费时间的。
简单而快速的解决方案是直接丢弃所有换行,然后将换行与数据分开打印。您可以使用scanf("n");
或仅使用单个getchar()
来丢弃换行,这两种方式都会占用换行。
固定程序工作与5 6
作为输入:
#include <stdio.h>
int main()
{
int n, m;
scanf("%d%dn", &n, &m);
char list[n][m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%c", &list[i][j]);
}
scanf("n"); // discard line feed
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%c",list[i][j]);
}
printf("n"); // print line feed explicitly
}
return 0;
}