自己学的程序出了一点问题,程序的输出和答案差了一行,求助大佬
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
char s[105];
int main(){
int n;
char c;
scanf("%c%d",&c,&n);
for(int i = 0;i <= n*n;i++){
scanf("%c",&s[i]);
}
for(int i = n * n;i >= 0;i--){
if(s[i] == '@')
printf("%c",c);
else if(s[i] == ' ')
printf(" ");
else if(s[i] == '\n')
printf("\n");
}
return 0;
}
这是运行结果
应该是因为字符数组的结束下标错了,应该是n*(n+1),因为每行还输入了一个换行,所以也要加上,然后再加上判断正向和倒过来的字符图形是否一致的代码,再把数组的长度扩大点就可以了。
修改如下:
参考链接:
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
// https://ask.csdn.net/questions/7415538?spm=1005.2025.3001.5141
char s[10100]; // 规定最多N 不超过100,加上每行后面一个换行,则数组最少需要 N*(N+1)=100*(100+1)=10100
int main(){
int n;
char c;
scanf("%c%d",&c,&n);
//printf("c=%c,n=%d\n",c,n);
for(int i = 0;i < (n+1)*n;i++){
scanf("%c",&s[i]);
}
int same=1; // 正向的字符图形和倒过来的字符图形是否一致的标志,默认1表示相同
int j=0;
for(int i = 0;i < n*(n+1)/2 ;i++,j++){ // 比较输入的字符图形前半部分与后半部分的字符是否一样
if(n==1){ //如果只需要了一个字符,则退出,即是与倒过来的字符图形一致
break;
}
char start=s[i]; // 前半部分当前位置的字符
char end = s[n*(n+1)-1-j]; // 后半部分对应位置的字符
if(start=='\n'){ // 如果前半部分遇到换行,则j--,以便抵消循环迭代的j++ ,然后判断前半部分下一个字符
j--;
continue;
}
if(end=='\n'){ // 同上,如果后半部分的字符遇到换行,则i--,以便抵消循环迭代的i++,然后判断后半部分下一个字符
i--;
continue;
}
if(start!=end){ // 如果前半部分字符和后半部分字符,不相等,则相同标志置0,表示正向和倒过来的字符图形不一致,然后break退出循环
// printf("s[%d]=%c,start=%c,end=%c,s[%d]=%c\n",i,s[i],start,end,n*(n+1)-1-j,s[n*(n+1)-1-j]);
same=0;
break;
}
}
if(same==1){ // 如果图像相同,则打印提示信息
printf("bu yong dao le\n");
}
// 打印从字符数组后半部分开始打印倒置图像
for(int i = n * (n+1)-1;i >= 0;i--){
if(s[i] == '@')
printf("%c",c);
else if(s[i] == ' ')
printf(" ");
else if(s[i] == '\n')
printf("\n");
}
return 0;
}