题目要求
编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按字符串中第一个单词的长度输出字符串和退出。菜单可以循环,直到用户输入退出请求。当然,程序要能真正完成菜单中的各项功能。
思路分析
多个功能的题要拆分多个模块来实现。本题主要设计了7个函数,分别为字符串输入函数、菜单打印函数、字符串输出函数、ascii排序函数、长度排序函数、按字符串中第一个单词的长度排序函数、求字符串的第一个单词的长度函数。
编写过程中主要输入模块又出了问题,我总是不记得字符串输入的内存分配,这里可以当作公式记一下,先在主函数分配内存,然后在输入模块中完成字符串输入。
代码编写
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LIM 10
int input_string(char *s[]);
void print_menu(void);
void output_string(char * s[],int k);
void ascii_order(char * s[],int k);
void length_order(char * s[],int k);
void first_order(char * s[],int k);
int first_length(char *s);
int main(int argc, const char * argv[]) {
char *inputString[LIM];
char choice;
int inputLength;
int i;
for (i=0; i<LIM; i++) {
inputString[i] = (char*) malloc(50*sizeof(char));
}
puts("Please input your strings:");
inputLength = input_string(inputString);
printf("your input length is %d\n",inputLength);
while((choice = getchar()) != 'e'){
print_menu();
choice = getchar();
switch (choice) {
case 'a':
output_string(inputString,inputLength);
break;
case 'b':
ascii_order(inputString,inputLength);
break;
case 'c':
length_order(inputString,inputLength);
break;
case 'd':
first_order(inputString,inputLength);
break;
case 'e':
puts("over.");
for (i=0; i<LIM; i++) {
free(inputString[i]);
}
return 0;
default:
puts("sorry,i can't understand");
}
}
for (i=0; i<LIM; i++) {
free(inputString[i]);
}
return 0;
}
int input_string(char *s[]){
int pt_number = 0;//输入计数
while(pt_number<LIM && gets(s[pt_number]) != NULL && s[pt_number][0] != '\0'){
//小于10、EOF、输入完毕
//gets函数输入EOF返回NULL
pt_number++;
}
return pt_number;
}
void print_menu(){
puts("Now enter what you want to do:");
puts("a. print the strings list");
puts("b. print the strings order by ASCII");
puts("c. print the strings order by length");
puts("d. print the strings order by length of the first word");
puts("e. quit");
}
void output_string(char * s[],int k){
int i=0;
for(i=0;i<k;i++){
puts(s[i]);
}
}
void ascii_order(char * s[],int k){
//按ASCII顺序输出字符串
char *temp;
int i=0;
int j=0;
for(i=0;i<k-1;i++){
for(j=i;j<k;j++){
if(strcmp(s[i], s[j]) >0){
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
output_string(s, k);
}
void length_order(char * s[],int k){
//按字符串长度递增顺序输出字符串
int i=0;
int j=0;
char * temp;
for(i=0;i<k-1;i++){
for(j=i;j<k;j++){
if(strlen(s[i])>strlen(s[j])){
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
output_string(s, k);
}
void first_order(char * s[],int k){
//对字符串第一个单词的长度排序
int i=0;
int j=0;
char * temp;
for(i=0;i<k-1;i++){
for(j=i;j<k;j++){
if(first_length(s[i])>first_length(s[j])){
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
output_string(s, k);
}
int first_length(char *s){
//找到字符串的第一个单词
int i;
int count=0;
int length;
length =strlen(s);
for(i=0;i<length;i++){
if(s[i] != ' '){
count++;
}else{
break;
}
}
return count;
}