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

时间:2018-01-28 17:14:14

标签: 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;
}

2 个答案:

答案 0 :(得分:1)

永远不会分配hold的内存。使用strcpy(hold, ..)将是一个问题。最好使用char hold[MAX_NAME_LENGTH];或使用new相应的内存资源进行分配。

其他数组string是一个编译时常量数组,您无法覆盖。

答案 1 :(得分:1)

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

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

现在,如果您声明字符串

,那么您的程序将会工作
char string[][10] = {"Nickole", "Bolden", "Eldon", "Darcie", "Lisette", "Furr", "Parthenia", "Tunison", "Andrew", "Michael"};

我将大小设为10,因为这里最长的字符串长度为9. \0字符的额外一个字节,表示字符串的结尾。

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

请参阅this帖子。

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

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()返回正值。