尝试使用结构按名称对输入进行排序,但程序在此函数上崩溃[关闭]

问题描述 投票:-2回答:2

这一直让我的程序崩溃,我觉得它喜欢丢失一些东西

void sort(struct Employee e[],int n)
{
    int i,j;
    struct Employee t;
    for(i=0;i<n+1;i++)
    {
        for(j=0;j<n-1;j++)
        {
            if(strcmp(e[i].name,e[j+1].name>0))
            {
                t=e[j];
                e[j]=e[j+1];
            }
        }
    }
}
c sorting struct
2个回答
2
投票

你有两个主要问题。 (1)你的冒泡排序通过索引j+1调用未定义的行为,e允许读取超出sortstrcmp的界限,并且(2)你的>0的右括号错误地放在-Wall -Wextra之后。

您可以采取两项基本措施来防止这种类型的编码错误,(1)始终在启用编译器警告的情况下进行编译,例如:这意味着将-Weverything添加到你的gcc编译器字符串,或者将/Wall添加到你的clang编译器字符串,或者将cl.exe添加到你的VS(#include <stdio.h> #include <string.h> #define MAXN 28 typedef struct { char name[MAXN]; int id; } employee_t; void sort (employee_t *e, int n) { int i, j; employee_t t = {{0},0}; for (i = 0; i < n; i++) for (j = 0; j < n - 1 - i; j++) if (strcmp (e[i].name, e[j+1].name) > 0) { t = e[j]; e[j] = e[j+1]; e[j+1] = t; } } int main (void) { employee_t e[] = { { "Joe T. Sloth", 1 }, { "Mary L. Lamb", 2 }, { "Allan Smith", 3 }, { "Nancy R. Drew", 4 }}; int i, n = sizeof e / sizeof *e; sort (e, n); for (i = 0; i < n; i++) printf ("%-14s %d\n", e[i].name, e[i].id); return 0; } )编译器sting,并且在它没有警告的情况下编译之前不接受代码,(2)将你的代码空间更多一些足以帮助您清楚地看到funciton参数列表的结束位置。这是一个选择问题,但可以大大提高代码的可读性,例如:

typedef

(注意:使用employee_t作为员工结构可以通过消除struct$ ./bin/sortemp Allan Smith 3 Joe T. Sloth 1 Mary L. Lamb 2 Nancy R. Drew 4 的每次使用前缀的需要,使语法更容易)

示例使用/输出

if(strcmp(e[i].name,e[j+1].name>0))

仔细看看,如果您有其他问题,请告诉我。


0
投票
e[j+1].name>0

上面的陈述是错误的,我认为有错误的错误,因为你比较if(strcmp(e[i].name,e[j+1].name)>0) 这是不正确的,它应该是

void sort(struct Employee e[],int n)
    {
        int i,j;
        struct Employee t;
            for(i=0;i<n+1;i++)
                for(j=0;j<n-1;j++)
                {
                    if(strcmp(e[i].name,e[j+1].name)>0)
                    {
                        t=e[j];
                        e[j]=e[j+1];
                        e[j+1]=t;
                    }
                }
    } 

你的完整代码为

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.