【问题标题】:Array of strings: Segmentation fault(core dumped)字符串数组:分段错误(核心转储)
【发布时间】:2017-12-05 07:03:50
【问题描述】:

我正在尝试编写一个代码,根据给定的命令行参数,按字母顺序或反向字母顺序对字符串数组进行排序。

“-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 a
The planets in alphabetical order are: Earth, Jupiter, Mars, Mercury, Neptune, Pluto, Saturn, Uranus, Venus

或者这个:

./planets –o r
The planets in reverse alphabetical order are: Venus, Uranus, Saturn, Pluto, Neptune, Mercury, Mars, Jupiter, Earth

程序编译没有错误,但是当我运行它时,我得到了

Segmentation fault(core dumped)

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

【问题讨论】:

  • 您的swap 函数无法按照您认为的方式运行。做一些关于在C中模拟通过引用传递的研究。
  • 另外,您应该了解使用= 分配和使用== 比较相等之间的区别。也许您应该get a good beginners book or two 阅读?
  • 此外,在像i = 0 这样的初始化之后,i == 8永远为真,因此您的外部循环将永远不会执行。也许您应该使用i &lt; 9(或i &lt;= 8)作为条件?
  • 最后,遇到这样的崩溃,你应该learn how to debug your programs。最好使用调试器
  • 你本质上是在问为什么int x=1; func(x); ... void func (int a) { a=2; } 不会改变 x 的值。

标签: c string segmentation-fault


【解决方案1】:

for 循环中,您使用了= 运算符而不是&lt;=&gt;=
注意:还有其他logical errors

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

#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;
}

您可以看到工作代码here(由于在线IDE限制,未提供命令行参数)。

【讨论】:

    【解决方案2】:

    我修复了指出的逻辑错误和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;
    }
    

    带有命令行参数-o a的结果:

    Mercury,Earth,Jupiter,Mars,Neptune,Pluto,Saturn,Uranus,Venus,   
    

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

    【讨论】:

    • 这是因为您没有正确排序。我已经更新了我的答案。它工作正常。你可以看到它在工作here
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2020-04-18
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多