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