C语言 使用scanf读取矩阵



我想从用户那里接收一个矩阵,就像下面的例子

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;
}

相关内容

  • 没有找到相关文章

最新更新