c - C 中随机名称按字母顺序排序

标签 c string sorting bubble-sort

我尝试按字母顺序对某些名称进行排序,但当我尝试使用冒泡排序方法将一个字符串复制到另一个字符串时,出现“段错误(核心转储)”错误。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <string.h>

int main() {
    char *string[] = {"Nickole", "Bolden", "Eldon", "Darcie", "Lisette", "Furr", "Parthenia", "Tunison", "Andrew", "Michael"};
    char *hold;
    int compare_a, compare_b;
    for(int j = 0; j < 9; j++) {
        for(int i = 0; i < 9; i++) {
            compare_a = string[i][0];
            compare_b = string[i+1][0];
            if( compare_a > compare_b) {           
                strcpy(hold, string[i+1]);
                strcpy(string[i+1], string[i]);
                strcpy(string[i], hold);
            }
        }
    }
    for(int i = 0; i < 9; i++) {
        printf("%s ", string[i]);
    }
    return 0;
}

最佳答案

程序中的字符串是字符串文字。文字就像常量,尝试修改它们会导致未定义的行为,尽管它们没有指定为 const。它们可能被放置在程序只能读而不能写的内存部分中。

您尝试使用 strcpy() 修改存储字符串文字的内存。由于调用了未定义的行为,您遇到了段错误。

现在,如果您声明像

这样的字符串,您的程序就会正常工作
char string[][10] = {"Nickole", "Bolden", "Eldon", "Darcie", "Lisette", "Furr", "Parthenia", "Tunison", "Andrew", "Michael"};

我将大小指定为 10,因为此处最长的字符串长度为 9。\0 字符额外增加一个字节,表示字符串结束。

这是因为它们不是字符串文字并且可以被修改。

参见this发布。

正如代码学徒在评论中建议的那样,您可以交换指针的值,而不是尝试交换字符串文字。

if( compare_a > compare_b) {
    hold=string[i];
    string[i]=string[i+1];
    string[i+1]=hold;
}

此外,您可以使用 strcmp() 来比较字符串,而不仅仅是比较字符串的第一个字符,例如

if( strcmp(string[i], string[i+1])>0 ) {
    hold=string[i];
    string[i]=string[i+1];
    string[i+1]=hold;
}

strcmp()如果第二个字符串按字典顺序位于第一个字符串之前,则返回正值。

关于c - C 中随机名称按字母顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48489083/

相关文章:

c - C 中大小整数的算术和按位操作

javascript - 按字母顺序对表格行进行排序

c++ - MPI_Send 发送数组地址还是数组内容

javascript - 如果 Div 或其子项包含特定的字符串/子字符串?

ruby - 按字典顺序排序

c - 像tcl的vwait,C编程有没有?

c - C 中的 strcpy 段错误

c - malloc 一个 char 和 null 终止符

c - 指向字符串的指针意外更改其值

python - 如何在不使用 csv 模块的情况下提取 csv 文件的内容并将其放入 dict 文件类型中。 [Python]