Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串数组:分段错误(堆芯转储)_C_String_Segmentation Fault - Fatal编程技术网

C 字符串数组:分段错误(堆芯转储)

C 字符串数组:分段错误(堆芯转储),c,string,segmentation-fault,C,String,Segmentation Fault,我试图编写一个代码,根据给定的命令行参数,按字母顺序或逆字母顺序对字符串数组进行排序 “o a”表示字母顺序 “-o r”表示反向 这是到目前为止我的代码 #include<stdio.h> #include<string.h> int string_compare(char *str1,char *str2){ int ret; ret=strcmp(str1,str2); if(ret < 0) { return 0;

我试图编写一个代码,根据给定的命令行参数,按字母顺序或逆字母顺序对字符串数组进行排序

“o a”表示字母顺序

“-o r”表示反向

这是到目前为止我的代码

#include<stdio.h>
#include<string.h>

int string_compare(char *str1,char *str2){
    int ret;

    ret=strcmp(str1,str2);

    if(ret < 0) {
      return 0;
    } 
    else if(ret > 0) {
      return 1;
    } 
    else {
      return -1;
    }
}

void swap(char *str1, char *str2)
{
  char *temp = str1;
  str1 = str2;
  str2 = temp;
}  

int main(int argc,char *argv[]){
    char *planets[9]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
    int i,j;
    int a_ret=strcmp(argv[2],"a");
    int r_ret=strcmp(argv[2],"r");
    int cmp;

    for(i=0;i=8;i++){
        for(j=8;j=(i+1);j--){
            cmp=string_compare(planets[j],planets[j-1]);
            if(a_ret==0){
                if(cmp==0){
                    swap(planets[j],planets[j-1]);
                }
            }
            else if(r_ret==0){
                if(cmp==1){
                    swap(planets[j],planets[j-1]);
                }
            }
        }
    }
    printf("%s",planets[0]);
   return 0;
}
或者这个:

./planets –o r
The planets in reverse alphabetical order are: Venus, Uranus, Saturn, Pluto, Neptune, Mercury, Mars, Jupiter, Earth
程序编译没有错误,但当我运行它时

Segmentation fault(core dumped)

我是C语言的新手,不太了解如何操作内存分配。非常感谢您提供的任何帮助或建议。

for
循环中,您使用了
=
运算符而不是
=

注意:还有其他
逻辑错误

更新:
您可以使用以下代码:

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 9

void swap(char **str1, char **str2)
{
  char *temp = *str1;
  *str1 = *str2;
  *str2 = temp;
}  

int main(int argc,char *argv[]){
    char *planets[MAX_SIZE]=    {"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
    int i, j, cmp, minMax;

    //If we don't need an array sorted in accending order then it is obvious that
    //we need it to be sorted in decending order
    int a_ret= (strcmp(argv[2],"a") == 0);

    for(i=0;i<MAX_SIZE;i++){
        minMax = i;
        for(j=i+1;j<MAX_SIZE;j++){
            cmp=strcmp(planets[j],planets[minMax]);
            if(((a_ret==0) && (cmp>0)) || ((a_ret==1) && (cmp<0))){
                    minMax =j;
            }
        }

        //Swap only if required
        if(i != minMax)
           swap(&planets[i], &planets[minMax]);
    }

    //Print the sorted array
    for(i=0;i<MAX_SIZE;i++)
        printf("%s | ",planets[i]);
   return 0;
}
#包括
#包括
#定义最大尺寸9
无效交换(字符**str1,字符**str2)
{
char*temp=*str1;
*str1=*str2;
*str2=温度;
}  
int main(int argc,char*argv[]){
char*行星[最大尺寸]={“水星”、“金星”、“地球”、“火星”、“木星”、“土星”、“天王星”、“海王星”、“冥王星”};
int i,j,cmp,minMax;
//如果我们不需要按顺序排序的数组,那么很明显
//我们需要按降序排序
int a_ret=(strcmp(argv[2],“a”)==0);

对于(i=0;i我修复了指出的逻辑错误和
swap
函数,程序运行时没有崩溃。结果基本正确,除了“Mercury”

当前计划:

#include<stdio.h>
#include<string.h>

int string_compare(char *str1,char *str2){
    int ret;

    ret=strcmp(str1,str2);

    if(ret < 0) {
      return 0;
    } 
    else if(ret > 0) {
      return 1;
    } 
    else {
      return -1;
    }
}

void swap(char** s1, char** s2)
{
    char* temp = *s1;
    *s1 = *s2;
    *s2 = temp;
}

int main(int argc,char *argv[]){
    char *planets[9]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
    int i,j;
    int a_ret=strcmp(argv[2],"a");
    int r_ret=strcmp(argv[2],"r");
    int cmp;

    for(i=0;i<8;i++){
        for(j=i+1;j<=8;j++){
            cmp=string_compare(planets[j-1],planets[j]);
            if(a_ret==0){
                if(cmp==1){
                    swap(&planets[j-1],&planets[j]);
                }
            }
            else if(r_ret==0){
                if(cmp==0){
                    swap(&planets[j-1],&planets[j]);
                }
            }
        }
    }
    for(int k=0;k<=8;k++){
        printf("%s,",planets[k]);

    }
    printf("\n");
return 0;
}

程序似乎跳过了数组中的第一个字符串。

您的
swap
函数的工作方式与您认为的不一样。请研究一下如何在C中模拟按引用传递。此外,您还应该了解使用
=
赋值与使用
=
进行相等比较之间的区别。您是否应该阅读?此外,在像
i=0
这样的初始化之后,
i==8
将永远不会为真,因此您的外部循环无论如何也不会执行。也许您应该使用
i<9
(或
i最后,对于这样的崩溃,您应该使用。最好使用调试器。您本质上是在问为什么
int x=1;func(x);…void func(int a){a=2;}
不会更改x的值。这是因为您没有正确进行排序。我已更新了我的答案。它工作正常。您可以看到它正在工作。
#include<stdio.h>
#include<string.h>

int string_compare(char *str1,char *str2){
    int ret;

    ret=strcmp(str1,str2);

    if(ret < 0) {
      return 0;
    } 
    else if(ret > 0) {
      return 1;
    } 
    else {
      return -1;
    }
}

void swap(char** s1, char** s2)
{
    char* temp = *s1;
    *s1 = *s2;
    *s2 = temp;
}

int main(int argc,char *argv[]){
    char *planets[9]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
    int i,j;
    int a_ret=strcmp(argv[2],"a");
    int r_ret=strcmp(argv[2],"r");
    int cmp;

    for(i=0;i<8;i++){
        for(j=i+1;j<=8;j++){
            cmp=string_compare(planets[j-1],planets[j]);
            if(a_ret==0){
                if(cmp==1){
                    swap(&planets[j-1],&planets[j]);
                }
            }
            else if(r_ret==0){
                if(cmp==0){
                    swap(&planets[j-1],&planets[j]);
                }
            }
        }
    }
    for(int k=0;k<=8;k++){
        printf("%s,",planets[k]);

    }
    printf("\n");
return 0;
}
Mercury,Earth,Jupiter,Mars,Neptune,Pluto,Saturn,Uranus,Venus,