将字符串数组传递给函数分段错误
Passing an array of strings to a function-segmentation fault
所以,我在下面编写了这段代码,它应该将一个字符串数组传递给一个函数,然后该函数将数组按字母顺序排序。我知道我完成它的方式可能并不漂亮,但它是用于学校的,我需要将它传递给一个函数并使用 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]);
}
您不能覆盖 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
in
char *states[11];
这是数组可以容纳的指针数。指针指向字符串文字,在这种情况下其大小并不重要。重要的是数组包含指针,你可以让指针指向其他地方,但是你不能像字符串文字占用的那样改变静态内存。
添加到 iharob 的答案中,如果所有字符串的长度都处于 11 状态,则您的代码应该可以正常工作。您的代码在尝试将 "Oregon" 与 "California" 交换时崩溃。由于 "California" 的长度是 11 个字节, "Oregon" 的长度是 7 个字节(包括空字符),当您使用 strcpy 将字符串数组 "Oregon" 覆盖为 "California"您的缓冲区溢出,程序将使用信号 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
所以,我在下面编写了这段代码,它应该将一个字符串数组传递给一个函数,然后该函数将数组按字母顺序排序。我知道我完成它的方式可能并不漂亮,但它是用于学校的,我需要将它传递给一个函数并使用 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]);
}
您不能覆盖 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
in
char *states[11];
这是数组可以容纳的指针数。指针指向字符串文字,在这种情况下其大小并不重要。重要的是数组包含指针,你可以让指针指向其他地方,但是你不能像字符串文字占用的那样改变静态内存。
添加到 iharob 的答案中,如果所有字符串的长度都处于 11 状态,则您的代码应该可以正常工作。您的代码在尝试将 "Oregon" 与 "California" 交换时崩溃。由于 "California" 的长度是 11 个字节, "Oregon" 的长度是 7 个字节(包括空字符),当您使用 strcpy 将字符串数组 "Oregon" 覆盖为 "California"您的缓冲区溢出,程序将使用信号 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