优化以下代码:#include <stdio.h> #include <string.h> #define MAX_STR_LEN 100 #define MAX_STR_NUM 1000 int main() { char strings[MAX_STR_NUM][MAX_STR_LEN]; int i = 0; while (i < MAX_STR_NUM && fgets(strings[i], MAX_STR_LEN, stdin) != NULL) { i++; } int j, k; char temp[MAX_STR_LEN]; for (j = 0; j < i-1; j++) { for (k = 0; k < i-j-1; k++) { if (strcmp(strings[k], strings[k+1]) > 0) { strcpy(temp, strings[k]); strcpy(strings[k], strings[k+1]); strcpy(strings[k+1], temp); } } } FILE *fp = fopen("sorted_strings.txt", "w"); if (fp == NULL) { printf("Failed to open file.\n");
时间: 2024-04-10 15:33:26 浏览: 84
以下是对代码的优化建议:
1. 使用`size_t`类型替代`int`类型来表示字符串数量和索引变量,这样可以更好地适应字符串的长度和大小。
2. 在冒泡排序中,可以添加一个标志变量来判断是否发生了交换。如果某一轮比较中没有发生交换,说明字符串已经有序,可以提前结束排序。
3. 使用`fwrite`函数一次性将排好序的字符串数组写入文件,而不是逐个写入。这样可以提高写入速度。
优化后的代码如下:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STR_LEN 100
#define MAX_STR_NUM 1000
int main() {
char strings[MAX_STR_NUM][MAX_STR_LEN];
size_t i = 0;
while (i < MAX_STR_NUM && fgets(strings[i], MAX_STR_LEN, stdin) != NULL) {
i++;
}
int sorted = 0;
size_t j, k;
char temp[MAX_STR_LEN];
for (j = 0; j < i-1 && !sorted; j++) {
sorted = 1;
for (k = 0; k < i-j-1; k++) {
if (strcmp(strings[k], strings[k+1]) > 0) {
strcpy(temp, strings[k]);
strcpy(strings[k], strings[k+1]);
strcpy(strings[k+1], temp);
sorted = 0;
}
}
}
FILE *fp = fopen("sorted_strings.txt", "w");
if (fp == NULL) {
printf("Failed to open file.\n");
return -1;
}
fwrite(strings, sizeof(char), i * MAX_STR_LEN, fp);
fclose(fp);
return 0;
}
```
这样,代码在排序过程中可以更早地终止,同时也减少了写入文件的次数,提高了效率。
阅读全文