c primer plus第十一章 第十一題
/* pe11.c -- manipulate the string list */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// to make sure this program can run on both win and linux
#ifdef WIN32
#include <windows.h>
#elif linux
#include <unistd.h>
#endif
#define MAX_V 10
#define MAX_L 100
/* the gets function */
char * s_gets(char * st, int n);
/* used to get string list */
int get_list(char str_list[MAX_V][MAX_L]);
/* copy list */
void copy(char dest[MAX_V][MAX_L], char src[MAX_V][MAX_L], int num);
/* show loading animation */
void animation(void);
/* show the menu */
int menu(void);
/* print the original list */
void print_original_list(char str_list[MAX_V][MAX_L], int num);
/* print the strings in ASCII order */
void print_ascii_list(char str_list[MAX_V][MAX_L], int num);
/* print the strings in length order*/
void print_length_list(char str_list[MAX_V][MAX_L], int num);
/* print the strings in the first word length order */
void print_first_word_list(char str_list[MAX_V][MAX_L], int num);
/* the main function */
int main(void)
{
?int opt, cnt;
?char str[MAX_V][MAX_L], tmp[MAX_V][MAX_L];
?cnt = get_list(str);
?copy(tmp, str, cnt);
?animation();
?while (opt = menu())
?{
? switch (opt)
? {
? ?case 1:
? ? print_original_list(str, cnt);
? ? break;
? ?case 2:
? ? print_ascii_list(tmp, cnt);
? ? break;
? ?case 3:
? ? print_length_list(tmp, cnt);
? ? break;
? ?case 4:
? ? print_first_word_list(tmp, cnt);
? ? break;
? ?default:
? ? printf("ERROR!!!");
? }
? printf("Press any key to continue.....");
? getchar();??
? animation();
?}
?puts("The program is stoped.");
?puts("Farewell!");
?return 0;
}
/* the gets function */
char * s_gets(char * st, int n)
{
?char * ret_val, tmp[n];
?int i = 0;
?ret_val = fgets(tmp, n, stdin);
?// printf("%p\n", ret_val); // for test
?if (ret_val)
?{
? strncpy(st, tmp, n);
? while (st[i] != '\n' && st[i] != '\0')
? ?i++;
? if (st[i] == '\n')
? ?st[i] = '\0';
? else
? ?while (getchar() != '\n')
? ? continue;
?}
?return ret_val;
}
/* used to get string list */
int get_list(char str_list[MAX_V][MAX_L])
{
?// to count to number of strings
?int cnt = 0;
?// to test if user input the EOF
?char * test = "";
?// prompt the user to input
?printf("Please enter %d strings or use EOF to stop input:\n", MAX_V);
?// get input
?while (cnt < 10 && test != NULL)
?{
? test = s_gets(str_list[cnt], MAX_L - 1);
? if (test != NULL)
? ?cnt++;
?}
?// to clear the EOF from the stdin stream
?clearerr(stdin); // include in the stdio.h
?// return the number of strings
?return cnt;
}
/* copy list */
void copy(char dest[MAX_V][MAX_L], char src[MAX_V][MAX_L], int num)
{
?int i = 0;
?for (i = 0; i < num; i++)
? strncpy(dest[i], src[i], MAX_L);
}
/* show animation */
void animation(void)
{
?int i = 0;
?printf("Please wait 5s [ ? ? ? ? ? ? ? ]\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
?for (i = 0; i < 5; i++)
?{
#ifdef WIN32
? Sleep(1000);
#elif linux
? sleep(1);
#endif
? printf("###");
? fflush(stdout);
?}
?putchar('\n');
#ifdef WIN32
?system("cls");
#elif linux
?system("clear");
#endif
}
/* show the menu */
int menu(void)
{
?int opt = -1;
?puts("-----------------------------MENU--------------------------------");
?puts("[1] print the original list");
?puts("[2] print the list in the ASCII order");
?puts("[3] print the list in the length order");
?puts("[4] print the list in the first word length order");
?puts("[0] quit\n\n");
?printf("Please enter your choice: ");
?scanf("%d", &opt);
?if (0 > opt || opt > 4)
?{
? printf("Please enter the correct option number: ");
? scanf("%d", &opt);
?}
?while (getchar() != '\n')
? continue;
?return opt;
}
/* print the original list */
void print_original_list(char str_list[MAX_V][MAX_L], int num)
{
?int i = 0;
?puts("\n-------------------------------------\n");
?for (i = 0; i < num; i++)
? puts(str_list[i]);
?puts("\n-------------------------------------\n");
}
/* print the strings in ASCII order */
void print_ascii_list(char str_list[MAX_V][MAX_L], int num)
{
?int i, j;
?char tmp[MAX_L];
?for (i = 0; i < num - 1; i++)
? for (j = i + 1; j < num; j++)
? ?if (strcmp(str_list[i], str_list[j]) > 0)
? ?{
? ? strcpy(tmp, str_list[i]);
? ? strcpy(str_list[i], str_list[j]);
? ? strcpy(str_list[j], tmp);
? ?}
?print_original_list(str_list, num);
}
/* print the strings in length order*/
void print_length_list(char str_list[MAX_V][MAX_L], int num)
{
?int i, j;
?char tmp[MAX_L];
?for (i = 0; i < num - 1; i++)
? for (j = i + 1; j < num; j++)
? ?if (strlen(str_list[i]) > strlen(str_list[j]))
? ?{
? ? strcpy(tmp, str_list[i]);
? ? strcpy(str_list[i], str_list[j]);
? ? strcpy(str_list[j], tmp);
? ?}
?print_original_list(str_list, num);
}
/* print the strings in the first word length order */
void print_first_word_list(char str_list[MAX_V][MAX_L], int num)
{
?int inword = 0, i, j, t, cnt[num];
?for (i = 0; i < num; i++)
? cnt[i] = 0;
?char tmp[MAX_L];
?// count
?for (i = 0; i < num; i++)
? for (j = 0; j < MAX_L; j++)
? {
? ?if (!inword && !(isspace(str_list[i][j]) || str_list[i][j] == '\0'))
? ?{
? ? inword = 1;
? ? cnt[i]++;
? ?}
? ?else if (inword && !(isspace(str_list[i][j]) || str_list[i][j] == '\0'))
? ? cnt[i]++;
? ?else if (!inword && (isspace(str_list[i][j]) || str_list[i][j] == '\0'))
? ? continue;
? ?else
? ?{
? ? inword = 0;
? ? break;
? ?}
? }
?/*
?for (i = 0; i < num; i++)
? printf("%d\n", cnt[i]);
?*/
?// sort
?for (i = 0; i < num - 1; i++)
? for (j = i + 1; j < num; j++)
? ?if (cnt[i] > cnt[j])
? ?{
? ? strcpy(tmp, str_list[i]);
? ? t = cnt[i];
? ? strcpy(str_list[i], str_list[j]);
? ? cnt[i] = cnt[j];
? ? strcpy(str_list[j], tmp);
? ? cnt[j] = t;
? ?}
?print_original_list(str_list, num);
}