背景:做了三个半小时,代码能力堪忧啊,各种调试,各种出错,要分析一下,这些错点尽量不能再错。
学习:1.对于字符串数组,要把每一行都开大一位,该位用来存放‘\0‘,否则将会出现未知输出。也就是说:字符串二维数组的每一行都可以看做一个字符数组,结尾都有一个‘\0‘.printf在用‘%s‘格式符输出字符串,总是从给定的首地址开始,遇到‘\0‘结束。
2.写程序的时候要有动态的眼光来看待当前写下的代码运行时的样子。运行出错不要理解单步调试,因先猜测是哪里错了,先看代码在脑中模拟。
#include<stdio.h> #include<string.h> int main(void) { int n, m, count = 1; while (scanf("%d", &n) == 1 && n){ scanf("%d",&m); char puzzle[n][m]; for (int i = 0; i<n; i++) scanf("%s", puzzle[i]); int num[n][m]; memset(num, 0, sizeof(num)); int count1 = 1; for (int i = 0; i<n; i++) for (int j = 0; j<m; j++){ if ((i - 1<0 || j - 1<0 || puzzle[i - 1][j] == '*' || puzzle[i][j - 1] == '*')&&puzzle[i][j]!='*') { num[i][j] = count1++; } else{ num[i][j] = 0; } } if (count - 1) printf("\n"); printf("puzzle #%d:\n", count++); //Across deal. printf("Across\n"); for (int i = 0; i < n; i++) for (int j = 0, key = 1; j < m; j++){ if (num[i][j]){ while (1){ if (j + key < m&&puzzle[i][j + key] != '*') key++; else break; } printf("%3d.", num[i][j]); for (int ii=j; j < ii + key; j++) printf("%c", puzzle[i][j]); printf("\n"); } key=1; } //Down deal. char ans[count1][n+1]; memset(ans,'\0',sizeof(ans)); printf("Down\n"); for (int i = 0; i < m; i++) for (int j = 0, key = 1; j < n; j++){ if (num[j][i]){ while (1){ if (j + key < n&&puzzle[j+key][i] != '*') key++; else break; } /*printf("%2d.", num[j][i]); for (int ii=j; j < ii + key; j++) printf("%c", puzzle[j][i]); printf("\n");*/ for (int ii=j,kk=0,gg=num[j][i]; j < ii + key; j++,kk++) { ans[gg][kk]=puzzle[j][i]; } } key=1; } for(int jj=1;jj<count1;jj++){ if(ans[jj][0]!='\0'){ printf("%3d.", jj); printf("%s\n",ans[jj]); } } } return 0; }
时间: 2024-11-01 01:28:05