这题本就是一道水题,但是让我弄出了 Output Limit Exceeded,起先没注意以为是自己的运行超时了,后来在优化下排序,发现不是如此。
最后才发现是,原来是最大数组长度是50,而且是字符串,而我真的设置了最大是50,造成最后字符数组尾部没有‘\0’,在输出的时候出问题了。
示例一:
#include <stdio.h> #define LENGTH 3 int main(void) { char a[3][LENGTH]; printf("输入:\n"); scanf("%s",a[0]); scanf("%s",a[1]); scanf("%s",a[2]); printf("输出:\n"); printf("a[0]:%s\n",a[0]); printf("a[1]:%s\n",a[1]); printf("a[2]:%s\n",a[2]); getchar(); getchar(); return 0; }
输出为:
示例二: 数组最后留出一个多余的 将length设置为4
#include <stdio.h> #define LENGTH 4 int main(void) { char a[3][LENGTH]; printf("输入:\n"); scanf("%s",a[0]); scanf("%s",a[1]); scanf("%s",a[2]); printf("输出:\n"); printf("a[0]:%s\n",a[0]); printf("a[1]:%s\n",a[1]); printf("a[2]:%s\n",a[2]); getchar(); getchar(); return 0; }
最后附上这道题目的代码:
#include <stdio.h> #include <stdlib.h> #define LENGTH 51 //开辟的数组的问题 #define N 100 //代表个数 与下面的m的意义相同 int comp ( const void *a, const void *b ) { return ( ( int * ) a ) [1] - ( ( int * ) b ) [1]; } int main() { int n,m; //n代表长度 m代表行数 char arr[N][LENGTH]; int arrNum[N][2]; while (scanf("%d %d",&n,&m) != EOF) { int i,j,k,sum,tmp1,tmp2; if(n<=0 || n>50 || m<=0 ||m>100) break; for( i=0; i<m; i++) { arrNum[i][0] = i; sum = 0; scanf("%s",arr[i]); for( j=0; j<n; j++) for ( k=j; k<n; k++) { if(arr[i][j] > arr[i][k]) sum++; } arrNum[i][1] = sum; } //qsort ( arrNum, i, sizeof ( int ) * 2, comp); for ( i=0; i<m; i++) for( j=i; j<m; j++) { if(arrNum[i][1] > arrNum[j][1]) { tmp1 = arrNum[j][0]; tmp2 = arrNum[j][1]; arrNum[j][0] = arrNum[i][0]; arrNum[j][1] = arrNum[i][1]; arrNum[i][0] = tmp1; arrNum[i][1] = tmp2; } } for ( i=0; i<m; i++) { printf("%s\n",arr[arrNum[i][0]]); } } return 0; }