所以,我在下面编写了这个代码,它应该将一个字符串数组传递给一个函数,然后将该数组按字母顺序排序。我知道我做的方式可能并不漂亮,但这是针对学校的,我需要将它传递给一个函数并使用strcmp
。我遇到了一些问题,但我设法将所有编译错误排序。但是,现在,当我尝试运行程序时,我收到错误segmentation fault(core dumped)
。有人可以引导我到我犯错误的地方吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
void sort(char *str[]);
int main()
{
char *states[11] = {"Florida", "Oregon", "California", "Georgia"};
sort(states);
return 0;
}
void sort(char *str[])
{
int x, y;
char alpha[11] = {0};
for(x = 1; x < 4; x++){
for(y = 1; y < 4; y++){
if(strcmp(str[y - 1], str[y]) > 0){
strcpy(alpha, str[y - 1]);
strcpy(str[y - 1], str[y]);
strcpy(str[y], alpha);
}
}
}
printf("\nThe states, in order, are: ");
for(x = 0; x < 4; x++)
printf("\n%s", str[x]);
}
答案 0 :(得分:2)
你不能覆盖strcpy()
将要做的字符串文字,修改字符串文字会调用未定义的行为,而是交换指针。
此
strcpy(alpha, str[y - 1]);
strcpy(str[y - 1], str[y]);
strcpy(str[y], alpha);
可以正常工作
alpha = str[y - 1];
str[y - 1] = str[y];
str[y] = alpha;
如果您将alpha
声明为
char *alpha;
另请注意,
中字符串的大小不是11
char *states[11];
它是数组可以容纳的指针数。指针指向字符串文字,在这种情况下,其大小并不重要。重要的是数组包含指针,你可以将指针指向其他位置,但你不能像字符串文字那样更改静态内存。
答案 1 :(得分:-1)
添加iharob的答案,如果11中的状态中所有字符串的长度,则代码应该有效。当您尝试将“Oregon”与“California”交换时,代码会崩溃。由于“California”的长度为11个字节,“Oregon”的长度为7个字节(包括空字符),因此当您使用strcpy用“California”覆盖字符串数组“Oregon”时,您的缓冲区溢出并且程序将核心转储信号11.您可以使用iharob建议的方法,或者您可以更改以下代码: -
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
void sort(char str[][11]);
int main()
{
char states[4][11] = {"Florida", "Oregon", "California", "Georgia"};
sort(states);
return 0;
}
void sort(char str[][11])
{
int x, y;
char alpha[11] = {0};
for(x = 1; x < 4; x++){
for(y = 1; y < 4; y++){
if(strcmp(str[y - 1], str[y]) > 0){
strcpy(alpha, str[y - 1]);
strcpy(str[y - 1], str[y]);
strcpy(str[y], alpha);
}
}
}
printf("\nThe states, in order, are: ");
for(x = 0; x < 4; x++)
printf("\n%s", str[x]);
}
产生的产出将是: -
gaurav@ubuntu:~$ ./a.out
The states, in order, are:
California
Florida
Georgia
Oregon