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;
}