#include<stdio.h> #include<string.h> #include<malloc.h> //定义一个交换函数 void reverse(char *a[],char *b[]) { char *tmp; tmp=*a; *a=*b; *b=tmp; } int main() { char *s[50],s1[50],*p; int i=0,n=0,j=0; scanf("%d",&n); //存入姓名和电话 for(;i<n;i++){ gets(s1); s[i] = (char*)malloc(sizeof(s1)); s[i]=strcpy(s[i],s1); } //对二维数组进行遍历,一行一行地比,冒泡排序法 for(i=0;i<n;i++) { for(j=n-1;j>i;j--){ if(s[i]<s[i-1]) reverse(&s[i],&s[i-1]); } } //输出电话簿 for(p=s[i],i=0;i<strlen(s[i]);i++){ if(*p==' ') { if(i>10) { for(j=10;*(p+j+i-10)!=' ';j++) s[j]=s[j+i-10]; printf("j=%d s[j]=%s\n",j,s[j]); } } } for(i=0;i<50;i++) printf("%s\n",s[i]); return 0;
时间: 2023-12-03 16:04:43 浏览: 66
(C语言版)考研复试核心题库之C语言程序设计编程题精编
这段代码存在一些问题:
1. 在输入姓名和电话号码时,使用了`gets()`函数,这个函数容易导致缓冲区溢出,建议使用`fgets()`函数替代。
2. 在冒泡排序中,比较大小的代码写错了,应该是`s[j]<s[j-1]`,而不是`s[i]<s[i-1]`。
3. 输出电话簿的部分存在一些逻辑上的问题,需要重新设计。
4. 在释放内存时,应该对每一个`s[i]`进行释放,而不是只对`s`进行释放。
下面是修改后的代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse(char **a, char **b) {
char *tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
char *s[50], s1[50], *p;
int i = 0, n = 0, j = 0;
scanf("%d", &n);
getchar(); // 清空输入缓冲区
for (i = 0; i < n; i++) {
fgets(s1, 50, stdin);
s[i] = (char *) malloc(sizeof(s1));
strcpy(s[i], s1);
}
for (i = 0; i < n; i++) {
for (j = n - 1; j > i; j--) {
if (strcmp(s[j], s[j-1]) < 0)
reverse(&s[j], &s[j-1]);
}
}
for (i = 0; i < n; i++) {
printf("%s", s[i]);
}
for (i = 0; i < n; i++) {
free(s[i]);
}
return 0;
}
```
阅读全文