C //例10.3 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。
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;
}