以下是我写的c primer plus 第11章习题10的程序,问题是我输入字符串后,用1以外的方式排序,就无法恢复原序列了。也就是每次调用函数都改变了原本数组的顺序,我实在找不到问题出在哪。特请高手指教,如果我的代码还有其他的什么毛病也请指出来。O(∩_∩)O谢谢
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define LIM 10
#define MAX 81
// 显示菜单函数
void display(void)
{
puts("******************************************");
puts("1)Print original string");
puts("2)Print in order of ASCII");
puts("3)Print in order of string's length");
puts("4)Print in order of first word's length");
puts("5)quit");
puts("******************************************");
}
// 判断字符串中第一个单词长度
int w_l(const char *s)
{
int length;
while(isspace(*s)) // 跳过空白字符
s++;
while(*s) // 遇到空字符就退出循环
{
if(!isspace(*s)) //
length++;
s++;
}
return length;
}
// 原样打印字符串
void opt1(char *msg[], int n)
{
int i;
for(i = 0; i<n; i++)
puts(msg[i]);
}
// 按ASCII码顺序打印字符串
void opt2(char *msg[], int n)
{
int i, j;
char *temp;
for(i = 0; i<n-1 ; i++)
for(j = i+1; j<n; j++)
if(strcmp(msg[i], msg[j]) > 0)
{
temp = msg[i];
msg[i] = msg[j];
msg[j] = temp;
}
for(i = 0; i<n; i++)
puts(msg[i]);
}
// 按字符串长度打印
void opt3(char *msg[], int n)
{
int i, j;
char *temp;
for(i = 0; i<n-1 ; i++)
for(j = i+1; j<n; j++)
if(strlen(msg[i]) > strlen(msg[j]))
{
temp = msg[i];
msg[i] = msg[j];
msg[j] = temp;
}
for(i = 0; i<n; i++)
puts(msg[i]);
}
// 按第一个单词长度打印
void opt4(char *msg[], int n)
{
int i, j;
char *temp;
for(i = 0; i<n-1 ; i++)
for(j = i+1; j<n; j++)
if(w_l(msg[i]) > w_l(msg[j]) )
{
temp = msg[i];
msg[i] = msg[j];
msg[j] = temp;
}
for(i = 0; i<n; i++)
puts(msg[i]);
}
// 调用驱动函数
int main(void)
{
char msg[LIM][MAX];
char *ptstr[LIM];
int i, choice;
puts("Input strings:");
for(i = 0; i < LIM && gets(msg[i]) != NULL; i++) // 将字符串存入数组
{
ptstr[i] = msg[i];
}
display();
while(scanf("%d", &choice) == 1 && choice != 5) // 菜单选择
{
switch(choice)
{
case 1: opt1(ptstr, i);
break;
case 2: opt2(ptstr, i);
break;
case 3: opt3(ptstr, i);
break;
case 4: opt4(ptstr, i);
break;
}
display();
}
puts("Bye.");
return 0;
}