按字母顺序排列字符串

时间:2010-07-12 16:06:09

标签: c

/ *编写一个程序,按升序对数组中输入的名称进行排序* / 当我在数组中输入名称时程序停止。任何人都知道为什么?

#include<stdio.h>
#include<string.h>
void main(void)
{
/*  write a program to sort names entered in an array in ascending order */
    int in,out,i,x;
    char temp[30],string2d[5][30];
    printf("ENTER NAMES IN THE ARRAY:");
    for(i=0;i<5 ;i++)
    {
        gets(string2d[i]);
    }
        for(out=0;out<5-1;out++)
        {
            for(in=out+1;out<5;in++)
            {
                x=strcmpi(string2d[out],string2d[in]);
                if(x>1)
                {
                    strcmpi(temp,string2d[out]);
                    strcmpi(string2d[out],string2d[in]);
                    strcmpi(string2d[in],temp);
                }
            }
        }

    for(i=0;i<5;i++)
    {
        puts(string2d[i]);
    }
    getch();
}

我已经看到了注释并对真实程序进行了更改,但程序仍然在循环和i之间循环

7 个答案:

答案 0 :(得分:5)

实际上,问题似乎就行了

for(in=out+1;out<5;in++)

你递增,但检查out是否小于5.

答案 1 :(得分:1)

我怀疑无限循环:

for(in=out+1;out<5;in++)
{
    x=strcmpi(string2d[out],string2d[in]);
    if(x>1)
    {
        strcmpi(temp,string2d[out]);
        strcmpi(string2d[out],string2d[in]);
        strcmpi(string2d[in],temp);
    }
}

您的循环条件out < 5永远不会改变,我怀疑您的意思是in < 5

同样如前所述,您可能正在使用strcmpi而不是strcpy。 另外strcmp*返回小于,等于或大于0的整数,您的代码会将此值与1进行比较

答案 2 :(得分:0)

我认为你的意思是strcpy(或者更好,strncpy)。

            strcmpi(temp,string2d[out]);
            strcmpi(string2d[out],string2d[in]);
            strcmpi(string2d[in],temp);

答案 3 :(得分:0)

你在哪里

                strcmpi(temp,string2d[out]);
                strcmpi(string2d[out],string2d[in]);
                strcmpi(string2d[in],temp);

你可能意味着strcpy

答案 4 :(得分:0)

一些注意事项:

使用函数strcmpi时,应检查返回值是否小于,等于或大于零,而不是1。

代码的最内部应该使用strncpy而不是strcmpi。当前的代码实际上没有做任何事情。

你的意思是什么意思“暂停”?它到底有多远?尝试在关键位置放置一些debug printf语句(例如在输入循环之后和for循环的每次迭代开始时),以便更好地了解代码的哪些部分存在错误行为。

答案 5 :(得分:0)

如前所述,您的三个strcmpi应该是副本。另请注意,如果第一个strcmpi(右侧)为strcmp,则您的x>1始终为false,并且if永远不会执行。

答案 6 :(得分:0)

使用qsort(测试)的一种方法:

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

//Changeable constants
const size_t MAX_LENGTH = 100;
const size_t N_NAMES = 10;

//Simple alias for lazy ones
typedef char String[MAX_LENGTH];

//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
    size_t const len = strlen(string);
    if(len && string[len-1] == '\n')
        string[len-1] = '\0';
}

//Input function
void ask_names(String names[N_NAMES]) {
    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("Name %u ? ", i+1);

        fgets(names[i], MAX_LENGTH, stdin);
        remove_end_rc(names[i]);
    }
}

//Output function
void print_names(String const names[N_NAMES]) {
    printf("Sorted :\n");

    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("%u) %s\n", i+1, names[i]);
    }
}

int alpha_cmp(void const *str1, void const *str2 ) {
    return strcmp((char const*)str1,(char const*)str2);
}

int main(void) {

    String names[N_NAMES] = {""};

    ask_names(names);
    //Sort alphabetically using strcmp
    qsort(names, N_NAMES, MAX_LENGTH, alpha_cmp);
    print_names(names);

    return 0;
}

另一种没有qsort()的方法,使用bubble算法:

#include <stdio.h>
#include <string.h>

/** Types *************************************/

//Changeable constants
#define MAX_LENGTH 100
#define N_NAMES 10

//Simple aliases for lazy ones
typedef char String[MAX_LENGTH];
typedef String Names[N_NAMES];

/** Input/Output ******************************/

//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
    size_t const len = strlen(string);
    if(len && string[len-1] == '\n')
        string[len-1] = '\0';
}

//Input function
void ask_names(Names names) {
    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("Name %u ? ", i+1);

        fgets(names[i], MAX_LENGTH, stdin);
        remove_end_rc(names[i]);
    }
}

//Output function
void print_names(Names names) {
    printf("Sorted :\n");

    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("%u) %s\n", i+1, names[i]);
    }
}

/** Sorting *************************************/

//Explicit
void swap_str(String s1, String s2) {
    String temp = "";

    strcpy(temp, s1);
    strcpy(s1, s2);
    strcpy(s2, temp);
}

#include <stdbool.h>

//Sorts alphabetically using bubble algorithm
void alpha_sort(Names names)
{
    bool swapped;

    do {
        swapped = false;

        for(size_t i = 0 ; i < N_NAMES-1 ; ++i) {
            if(strcmp(names[i], names[i+1])) {
                swap_str(names[i], names[i+1]);
                swapped = true;
            }
        }
    }while(!swapped);
}

/** Main program **********************************/

int main(void) {

    Names names = {""};

    ask_names(names);
    alpha_sort(names);
    print_names(names);

    return 0;
}

你可以通过处理案件(下层,上层),符号来改善它......但基本上它可以完成它的工作。