C程序设计 (第四版) 谭浩强 习题8.12
习题 8.12 用指针数组处理上一题目,字符串不等长。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(char *s[10], int n); //定义排序函数
int main(){
char *str[10], **p;
for(int i = 0; i < 10; i++){
str[i] = (char*)malloc(20 * sizeof(char)); //为指针数组分配内存动态空间
printf("Please enter No.%d string: ", i+1); //输入10个字符串
scanf("%s", str[i]);
}
sort(str, 10); //调用排序函数
for(p = str, printf("Sort by: "); p < str + 10; printf("%s ", *p++)); //输出排序后的10个字符串
printf("\n");
system("pause");
return 0;
}
//排序函数
void sort(char *s[10], int n){
int i, j;
char *t;
for(i = 0; i < n; i++){
for(j = i + 1; j < n; strcmp(s[i], s[j]) > 0 ? t = s[i], s[i] = s[j], s[j] = t, j++ : j++);
}
}
方法2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 3
#define N 80
void initialStr(char ***str, int m, int n){
*str = (char**)malloc(m * sizeof(char*));
for(int i = 0; i < m; i++){
(*str)[i] = (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]);
}
}
void sortStr(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 outputStr(char **str, int m){
printf("\nNew sort:\n");
for(int i = 0; i < m; i++){
printf("%s\n", str[i]);
}
}
void freeStr(char ***str, int m){
for(int i = 0; i < m; i++){
free((*str)[i]);
}
free(*str);
}
int main(){
char **str = NULL;
initialStr(&str, M, N);
inputStr(str, M);
sortStr(str, M, N);
outputStr(str, M);
freeStr(&str, M);
system("pause");
return 0;
}