我尝试按字母顺序对某些名称进行排序,但得到"分段错误(核心转储)"我尝试使用冒泡排序方法将一个字符串复制到另一个字符串时出错。 这是我的代码:
#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;
}
答案 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()
返回正值。