先说下,代码很漂亮,赏心悦目啊!
主要问题是对数组理解不够吧,字符串交换直接换指针,不可以的,数组毕竟不是指针
用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 ("************************************************************************");
}