c++ 按字母顺序排序名称

Posted

技术标签:

【中文标题】c++ 按字母顺序排序名称【英文标题】:c++ sorting names alphabetically 【发布时间】:2011-09-16 00:20:33 【问题描述】:

我有一个程序试图按字母顺序对某些名称进行排序。我运行它,它没有任何错误,但名称没有排序。我比较了 2 个名称,看看哪个应该在数组中移动。

代码如下:

void sort_names(char array[])

    const int arraysize = 5;

    // Step through each element of the array
    for (int startindex = 0; startindex < arraysize; startindex++)
    

        int smallestnum = startindex;

        for (int currentindex = startindex + 1; currentindex < arraysize; currentindex++)
        
            // If the current element is smaller than our previously found smallest
            if ((student_list[currentindex].lname) < (student_list[smallestnum].lname))
            // Store the index 
            smallestnum = currentindex;
        

        // Swap our start element with our smallest element
        swap(student_list[startindex], student_list[smallestnum]);
    

我的结构如下所示:

struct student 
    char fname[30]; 
    char lname[30];
;

我是否必须将它们转换为字符串,因为它们是字符数组?我有点迷茫,想弄清楚如何让它正确排序。

【问题讨论】:

文本字符串在 C++ 中通常最好用std::string 表示。 const char* 也是可能的,但char[] 在大多数情况下并不是一个真正好的解决方案。 这看起来像家庭作业,如果是这样,请适当地标记它。如果不是,则使用 std::lexicographical_compare 移至 std::string 和 std::sort。 为什么不直接使用std::vectorstd::stringstd::sort?然后,您的代码将减少为一行。 【参考方案1】:

问题在于这一行:

if ((student_list[currentindex].lname) < (student_list[smallestnum].lname))

它不比较字符串字符,而是比较内存地址。

如果您仍想使用char 数组,则必须使用strcmp 函数。不过,我建议您改用string

【讨论】:

谢谢,我使用了strcmp,它可以工作。我不得不使用 char 来完成作业。【参考方案2】:

问题出在这一行:

if ((student_list[currentindex].lname) < (student_list[smallestnum].lname))

行比较指针,不比较内容。

应该是:

if ( strcmp( student_list[currentindex].lname, student_list[smallestnum].lname ) < 0 )

另一种选择是使用 std::string 代替,它具有内置的比较。例如:

struct student 
    std::string fname; 
    std::string lname;
;

【讨论】:

以上是关于c++ 按字母顺序排序名称的主要内容,如果未能解决你的问题,请参考以下文章

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

按字母顺序对列表中的名称进行排序?

按字母顺序排序和过滤使用工作表名称自动填充的组合框

在 C++ 中使用链表按字母顺序对字符串进行排序

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

如何通过删除名称开头的数字按字母顺序对数据进行排序[重复]