1

对于给定的数组,我需要编写一个函数来按字母顺序对单词进行排序:

char strings [][10] = {
    "hello",
    "world",
    "computers",
    "are",
    "awesome"
};

我尝试sortWords使用插入排序来编写函数,但我认为我的交换函数不起作用:

void swap(char *e1, char *e2) {
    int tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
}

void sortWords( char (* words2Darray)[10], unsigned short length ) {
    unsigned int i, curPos;
    char curChars[10];

    for(i = 1; i < length; i++) {
        // Copy the current word into curChars
        strncpy_s(curChars, words2Darray[i], 10);
        curPos = i;

        // Compare and move the word to the correct position
        while(curPos > 0 && strcmp(curChars, words2Darray[i-1]) > 0) {
            swap(words2Darray[curPos], words2Darray[curPos-1]);
            curPos--;
        }
    }
}

我尝试使用本地 Windows 调试器调试我的代码,发现它curChars被正确复制。

有人可以向我解释我做错了什么以及我应该如何解决这个问题?我不允许std::string在这个问题中使用。请没有完整的解决方案!

4

2 回答 2

2

您可以使用std::sort

std::sort(std::begin(strings), std::end(strings), cmp);

这需要一个比较器。我根据strcmp.

在 IdeOne上现场观看

#include <algorithm>
#include <iostream>
#include <cstring>

int main()
{
    char const* strings[] = {
        "hello",
        "world",
        "computers",
        "are",
        "awesome"
    };

    struct { 
        bool operator()(char const* a, char const* b) const {
            return (a && b)? 0 > strcmp(a,b) : a < b;
        }
    } cmp;

    std::sort(std::begin(strings), std::end(strings), cmp);

    for (auto& s : strings)
        std::cout << s << "\n";
}

请注意,我冒昧地制作了数组元素char*而不是char[]. 这是由于 Carl Norum 指出的原因。

于 2013-09-24T22:32:24.657 回答
1

您不是在交换字符串,而是在交换字符串的第一个字符。如果你想按值传递,你需要类似的东西:

void swap(char **e1, char **e2) {
    char *tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
}

然后使用它:

swap(&words2Darray[curPos], &words2Darray[curPos-1]);

或者,您可以按原样保留swap通话并使用参考:

void swap(char *&e1, char *&e2) {
    char *tmp = e1;
    e1 = e2;
    e2 = tmp;
}

(我认为这是对的——我的 C++ 生锈了。我会做一个测试来确定。)

于 2013-09-24T21:12:53.660 回答