这一直让我的程序崩溃,我觉得它喜欢丢失一些东西
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];
}
}
}
}
你有两个主要问题。 (1)你的冒泡排序通过索引j+1
调用未定义的行为,e
允许读取超出sort
中strcmp
的界限,并且(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))
仔细看看,如果您有其他问题,请告诉我。
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