#include <stdio.h> #include <string.h> int main(){ int n; scanf("%d",&n); char a[n][20]; char (*p)[20]=a; for(int i=0;i<n;i++){ fgets(a[i],sizeof(a[i]),stdin); a[i][strspn(a,"\n")]='\0'; } for(int i=0;i<n;i++){ printf("%s",*p); } for(int i=0;i<n;i++){ printf("%s",a[i]); } printf("--------------"); for(int i=0;i<n;i++){ for(int j=i+1;j<n-1;j++){ if(strcmp(a[j],a[i])>0){ char tem[20]; strcpy(tem,a[i]); strcpy(a[i],a[j]); strcpy(a[j],tem); } } } for(int i=0;i<n;i++){ printf("%s",a[i]);} return 0; }哪错了
时间: 2024-01-09 11:05:57 浏览: 28
这段代码存在一些问题,以下是其中的几个:
1. 使用变长数组 `char a[n][20]`,需要保证 `n` 是一个常量值。但是在 C 语言中,变量不能作为数组的长度,因此需要使用动态内存分配来实现变长数组。
2. 在使用 `fgets` 函数读取字符串时,需要注意每次读取完后会自动在字符串末尾添加一个换行符 `\n`,需要将其替换成字符串结束符 `\0`。
3. 在输出字符串时,使用了 `printf("%s",*p)`,但是 `p` 是一个指向数组的指针,`*p` 表示指向数组的第一个元素,因此应该改为输出 `*(p+i)` 或者 `p[i]`。
4. 在进行冒泡排序时,循环条件应该是 `j<n` 而不是 `j<n-1`,否则会漏掉最后一个元素。
以下是经过修改后的代码,可以正常运行:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int n;
scanf("%d", &n);
char (*a)[20] = malloc(sizeof(char[n][20])); // 动态内存分配
for(int i = 0; i < n; i++){
fgets(a[i], sizeof(a[i]), stdin);
a[i][strcspn(a[i], "\n")] = '\0'; // 将换行符替换成字符串结束符
}
for(int i = 0; i < n; i++){
printf("%s\n", *(a+i)); // 输出数组元素
}
for(int i = 0; i < n; i++){
printf("%s\n", a[i]); // 输出数组元素
}
printf("--------------\n");
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){ // 循环条件修正
if(strcmp(a[j], a[i]) > 0){
char tem[20];
strcpy(tem, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], tem);
}
}
}
for(int i = 0; i < n; i++){
printf("%s\n", a[i]);
}
free(a); // 释放动态内存
return 0;
}
```