如何制作用户定义的程序来排序字符串?

时间:2014-06-10 08:04:24

标签: c sorting

以下是我的代码。我正在尝试手动创建排序命令。我正在排序字符串。但我没有得到所需的输出。所以请帮助我。

#include<stdio.h>
main()
{
    int i,j=0;
    char temp[10][5];
    char a[10][5]={"abc","xyz","pqrs","abcde","wxy"
                    "cd","lmnop","lmnkq","jkl","ghij"};
    for(i=0;i<10;i++)
    {
        while(a[i][j]==a[i+1][j])
            j++;
        if(a[i][j]>a[i+1][j])
        {
            temp[i][j]= a[i][j];
            a[i][j] = a[i+1][j];
            a[i+1][j] = temp[i][j];
        }
    }
    for(i=0;i<9;i++)
    {
        printf("%s\n",a[i]);
    }
 }

2 个答案:

答案 0 :(得分:0)

您无法将c字符串与==,&gt;进行比较和&lt;

char a[5] = "abc";
char b[5] = "abc";

尝试此代码并查看条件将评估为false

if(a == b)
    printf("they are different");

当你这样做时,你正在比较它们的地址......

使用string.h中的函数strcmp

if(strcmp(a, b) == 0)
    printf("they are equal");

你不能使用=来分配,使用strcpy,也来自string.h

答案 1 :(得分:0)

这里有几件事情发生了:

  • 您的一些字符串长度为5个字符,如果省略终止空字符,则只适合char[5]。打印此类字符串也会打印以下字符串,因为内存布局是连续的。另请注意,只使用9个字符串初始化数组,因为字符串文字"wxy" "cd"的串联与单个字符串"wxycd"相同。

  • 交换字符串时,必须交换所有字符串的字符,但可以跳过相同的字符。

  • 您实现冒泡排序,但只进行一次更改相邻字符串。这还不足以对数组进行排序;你必须重复传递它,直到所有字符串都被排序。

  • 您传递所有元素0到9,但随后访问a[i + 1],这是10,因此如果i == 9超出范围。您可以调整右边界,也可以从i = 1开始,然后找到a[i - 1]

所以,这是一个有效的版本:

#include <stdio.h>

int main()
{
    int i, j;
    int done = 0;       /* mark whether we are done */
    char a[10][6] = {
        "abc", "xyz", "pqrs", "abcde", "wxy",
            "cd", "lmnop", "lmnkq", "jkl", "ghij"
    };

    while (!done) {
        done = 1;       /* assume that we're done */

        for (i = 0; i < 9; i++) {
            j = 0;
            while (a[i][j] == a[i + 1][j]) j++;
            if (a[i][j] > a[i + 1][j]) {
                while (j < 6) {
                    int temp = a[i][j];

                    a[i][j] = a[i + 1][j];
                    a[i + 1][j] = temp;
                    j++;
                }
                done = 0;   /* we've swapped strings, so we need to do more */
            }
        }
    }

    for (i = 0; i < 10; i++) {
        printf("%s\n", a[i]);
    }

    return 0;
}

代码仍然有点尴尬,因为它试图在一个大块中执行所有操作,并且它适用于静态数组边界和缓冲区大小。更好的排序只是将指针交换到字符串。