C程序设计 (第四版) 谭浩强 例10.3
例10.3 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法:使用指针,函数的模块化设计,动态分配内存
说明:这里准备先写入的文件名称为Test.txt,文件已经存在于该项目目录下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define M 3
#define N 80//初始化所需变量
void initialVar(char ***str, int m, int n, char **name){*str = (char**)malloc(m * sizeof(char*));for(int i = 0; i < m; i++){(*str)[i] = (char*)malloc(n * sizeof(char));}*name = (char*)malloc(n * sizeof(char));
}//输入字符串
void inputStr(char **str, int m){printf("Enter %d Strings:\n", m);for(int i = 0; i < m; i++){printf("Enter No.%d Strings: ", i + 1);gets(str[i]);}printf("\n");
}//对字符串进行升序排列
void ascendingSortStr(char **str, int m, int n){char *temp = (char*)malloc(n * sizeof(char));for(char **p = str; p < str + m; p++){for(char **q = p + 1; q < str + m; q++){if(strcmp(*p, *q) > 0){strcpy(temp, *p);strcpy(*p, *q);strcpy(*q, temp);}}}free(temp);
}//输入文件名称
void inputFileName(FILE **file, char *name){printf("Enter File Name: ");scanf("%s", name);*file = fopen(name, "r");if(*file == NULL){perror("Cannot open this file");system("pause");exit(0);}*file = fopen(name, "w+");
}//将字符串写入文件
void inputFile(FILE **file, char **str, int m){for(int i = 0; i < m; i++){fputs(str[i], *file);fputs("\n", *file);printf("%s\n", str[i]);}fclose(*file);putchar(10);
}//释放分配变量的内存
void freeVar(char ***str, int m, char **name){for(int i = 0; i < m; i++){free((*str)[i]);}free(*str);free(*name);
}int main(){FILE *file = NULL;char **str = NULL;char *name = NULL;initialVar(&str, M, N, &name);inputStr(str, M);ascendingSortStr(str, M, N);inputFileName(&file, name);inputFile(&file, str, M);freeVar(&str, M, &name);system("pause");return 0;
}