按字母顺序对 c 字符串数组进行排序

Posted

技术标签:

【中文标题】按字母顺序对 c 字符串数组进行排序【英文标题】:Sorting array of c strings alphabetically 【发布时间】:2014-02-09 22:03:30 【问题描述】:

我有一个家庭作业问题,我遇到了一些问题,我被要求使用 C++ 按字母顺序对 C 字符串数组进行排序,使用的排序算法必须是冒泡排序。到目前为止我所做的(复制如下)可以对数组进行排序,但仅基于第一个字母表。如何进一步对具有相同初始字母的字符串进行排序?

<snipped>@arch:~/College/OOP/Lab/W3$ cat 2.cpp

/*
 * Write a function which sorts an array of C strings in ascending order using bubble sort. The
 * number of strings in the array and the array must be passed as parameters to the function
 */

#include <iostream>
#include <cstring>

using namespace std;

void sort(char **sar, unsigned num, unsigned len)

    char *temp = new char[len];

    if (temp == NULL)
    
        cout << "\nOut-Of-Memory\n";
        return;
    

    for (unsigned a = 0; a < num-1; a++)
    
        for (unsigned b = 0; b < ((num-a)-1); b++)
        
            if (sar[b][0] > sar[b+1][0])
            
                strcpy(temp, sar[b]);
                strcpy(sar[b], sar[b+1]);
                strcpy(sar[b+1], temp);
            
        
    

    delete[] temp;


int main(int argc, char *argv[])

    char **sar;
    unsigned num;
    unsigned len;

    cout << "Number of Strings: ";
    cin  >> num;
    cout << "Length of Strings: ";
    cin  >> len;

    cin.ignore(); // Flush buffer to fix a bug (getline after cin).

    sar = (char **) new char*[num];
    if (sar == NULL)
    
        cout << "\nOut-Of-Memory\n";
        return -1;
    

    for (unsigned i = 0; i < num; i++)
    
        sar[i] = (char *) new char[len];
        if (sar[i] == NULL)
        
            // Let's pretend we 'know' memory management
            // because obviously modern OSs are incapable
            // of reclaiming heap from a quitting process..
            for (unsigned j = 0; j < i; j++)
                delete[] sar[j];
            cout << "\nOut-Of-Memory\n";
            return -1;
        
    

    for (unsigned x = 0; x < num; x++)
        cin.getline(&sar[x][0], 512);

    sort(sar, num, len);

    cout << '\n';
    for (unsigned y = 0; y < num; y++)
        cout << sar[y] << '\n';

    for (unsigned z = 0; z < num; z++)
        delete[] sar[z];
    delete[] sar;

    return 0;

【问题讨论】:

delete 的使用无效。你应该使用delete[] 具体在哪里? valgrind 不会对这样的事情咧嘴笑。 在您的排序功能中也是如此。接近尾声时,您在 temp 上致电 delete。应该是 delete[] 谢谢,但这对我的问题并没有真正的影响。很快就会更新。 【参考方案1】:

改变

if (sar[b][0] &gt; sar[b+1][0])

if (stricmp(sar[b], sar[b+1]) &gt; 0)

更新:代替stricmp,您可以使用strcasecmp

【讨论】:

That 不是标准的,是吗? (另见here) 非常感谢!我对该函数进行了一些搜索,并在 g++ 手册中找到了一个等效的 strcasecmp 。

以上是关于按字母顺序对 c 字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串属性按字母顺序对对象数组进行排序

除数字外,如何按字母顺序对对象数组进行排序?

按特定顺序对名称数组进行排序

在 C++ 中对字符串数组进行排序

首先按频率对字符串中的字符进行排序,然后按字母顺序排序

使用冒泡排序对Java中的名称数组按字母顺序排序