先说下,代码很漂亮,赏心悦目啊!
主要问题是对数组理解不够吧,字符串交换直接换指针,不可以的,数组毕竟不是指针
用strcpy,虽然麻烦了点
另外,你的switch没有break,这个问题也蛮严重的
主要问题是对数组理解不够吧,字符串交换直接换指针,不可以的,数组毕竟不是指针
用strcpy,虽然麻烦了点
另外,你的switch没有break,这个问题也蛮严重的
[fly]存在即是合理[/fly]
/* 读入若干字符串,并按格式输出 */ #include <stdio.h> #include <string.h> #define ROW 10 /* 最大限制字符串的数目 */ #define LINE 100 int getns (char *, int); /* 输入字符串的函数 */ void ascii (char **, int); /* 按照ASCII顺序的函数 */ void length (char **, int); /* 按长度递增顺序的函数 */ void first_length (char **, int); /* 按手单词长度递增顺序的函数 */ int first_strlen (char *); /* 比较首个单词长度的函数 */ void strlen1 (char *, int *, int); /* 计算每个字符串长度的函数 */ void menu (void); /* 输出菜单选项的函数 */ int main (void) { char input[ROW][LINE]; char *ptrinput[ROW]; char choice; int row = 0; /* 字符串的数目 */ int i; puts ("Please enter a series of sentence."); while (row < ROW && gets (input[row])) { if (*input[row] == EOF) break; ptrinput[row] = input[row]; row++; } /* 将字符串赋予指针 */ length (ptrinput, row); /*menu (); while ((choice = getchar ()) != 'q') { if (choice == '\n') continue; switch (choice) { case 'a': { for (i = 0; i < row; i++) puts (ptrinput[i]); } case 'b': ascii (ptrinput, row); case 'c': length (ptrinput, row); case 'd': first_length (ptrinput, row); } if (choice != 'a' && choice != 'b' && choice != 'c' && choice != 'd') puts ("Please enter a, b, c, d or q:"); menu (); }*/ return 0; } /* 按照ASCII顺序的函数 */ void ascii (char ** p, int i) { int j, k, l; char *output[ROW]; for (j = 0; j < i; j++) { l = 0; for (k = 0; k < i; k++) { if (j == k) continue; if (strcmp (p[j], p[k]) >= 0) l++; } output[l] = p[j]; } for (l = 0; l < i; l++) puts (output[l]); } /* 按长度递增顺序的函数 */ void length (char ** p, int i) { int j, k, l; int length[ROW]; char *output[ROW]; for (j = 0; j < i; j++) strlen1 ((char *) p, length, i); for (j = 0; j < i; j++) { l = 0; for (k = 0; k < i; k++) { if (k == j) continue; if (length[j] > length[k]) l++; } output[l] = p[j]; } for (l = 0; l < i; l++) puts (output[l]); } /* 按手单词长度递增顺序的函数 */ void first_length (char ** p, int i) { int j, k, l; char *output[ROW]; for (j = 0; j < i; j++) { l = 0; for (k = 0; k < i; k++) { if (k == j) continue; if (first_strlen (p[j]) > first_strlen (p[k])) l++; } output[l] = p[l]; } for (l = 0; l < i; l++) puts (output[l]); } /* 比较首个单词长度的函数 */ int first_strlen (char * p) { int i = 0; while (p[i] >= 'a' && p[i] <= 'z' || p[i] >= 'A' || p[i] <= 'Z') i++; return i; } /* 计算每个字符串长度的函数(本程序未包含头文件“string.h”) */ void strlen1 (char * p, int * i, int j) { int k = 0; int length; int all_length = 0; while (k < j) { length = 0; while (p[all_length] != '\0') { length++; all_length++; } all_length++; i[k] = length; k++; } } /* 输出菜单选项的函数 */ void menu (void) { puts ("************************************************************************"); puts ("Please choose what to do:"); puts ("a. 输出初始字符列表 b. 按ASCII顺序输出字符串"); puts ("c. 按长度递增顺序输出字符串 d. 按字符串中第一个单词长度输出字符串"); puts ("q. Quit."); puts ("************************************************************************"); }