这是代码
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
char a[n+5][n+5];
for (int i = 0; i <= n - 1; i++)
{
for (int j = 0; j <= n - 1; j++)
{
scanf("%c", &a[i][j]);
}
}
for (int k = 0; k < n ; k++)
{
for(int m = 0 ; m < n ; m++){
cout << a[k][m];
}
}
for (int m = 0 ; m < n ; m++){
cout << a[n-1][m];
}
return 0;
}
输入
9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
运行结果
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @ @ @
可以看到a数组最后一行没有输出出来,然后重新写的循环输出最后一行就并不是输入的那串数据了,想知道这是为什么?
比较一下
#include <stdio.h>
int main()
{
int n=3;
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
scanf("%c",&a[i][j]);
getchar();
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}
scanf("%c", &a[i][j]);
换行符也被当字符接收了,而且记录到了下一行的第一个字符。
这么改吧:
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
char a[n+5][n+5] = {0};
for (int i = 0; i <= n - 1; i++)
{
getchar();
gets(a[i]);
}
for (int k = 0; k < n ; k++)
{
cout<<a[k]<<endl;
}
return 0;
}
因为每一行输入之后都有一个换行符‘\n’
scanf("%c", &a[i][j])是会读取换行符‘\n’的,
在第一行读取之后,输入缓存里就残留了一个‘\n’。
数组第二行第一个字符a[1][0]读的是上一行残留的‘\n’,这样就错位了,循环次数是固定的,每行多一个‘\n’,最后一行的输入就不会读取了
可以用getchar() 把每行的‘\n’读取掉即可
你题目的解答代码如下:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
char a[n+5][n+5];
for (int i = 0; i <= n - 1; i++)
{
getchar(); //用getchar() 把每行的‘\n’读取掉
for (int j = 0; j <= n - 1; j++)
{
scanf("%c", &a[i][j]);
}
}
for (int k = 0; k < n ; k++)
{
for(int m = 0 ; m < n ; m++){
cout << a[k][m];
}
cout << endl; //输出时再把每行的‘\n’加上
}
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!