IIlIIlllIIll 2015-10-03 10:36 采纳率: 60%
浏览 1651

新手求教,关于传递字符串数组的问题

以下是我写的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;
}
  • 写回答

2条回答 默认 最新

  • bdmh 移动开发领域优质创作者 2015-10-03 11:41
    关注

    你改写了原数组,你在方法内部声明一个临时数组,来排序,不要改写原有的

    评论

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题