回复 17楼 azzbcc
我把主函数的一部分注释掉了,然后就想下面的一样:
/* 读入若干字符串,并按格式输出 */ #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 ("************************************************************************"); }
结果发现,当主函数被我注释那部分前面,我把case 'a'的代码写上去运行,没有任何错误,case 'b'的也没有任何错误,但是另外两个选项就有错误了。然后我把c选项的函数改了,改成这样。但还是不对。我真的不知道该怎么改了。不过我能断定,错误应该在被注释的那段代码中,和c、d两个选项的函数中。麻烦您再给看看。谢谢了!
