排序(C语言)

排序(C语言),c,C,我试图从用户输入的数字(代码)中对结构进行排序,我使用冒泡排序。我希望程序打印所有按数字(代码)排序的数据,但它只对数字(代码)排序。有人能帮我从数字(代码)中对其他元素进行排序吗 代码: #包括locale.h #包括stdio.h #包括string.h int main(void){ setlocale(葡萄牙语); int aux=0,i,j; 结构护墙板{ int codigo; char titulo[40]; }利夫罗[10]; 对于(i=0;i

我试图从用户输入的数字(代码)中对结构进行排序,我使用冒泡排序。我希望程序打印所有按数字(代码)排序的数据,但它只对数字(代码)排序。有人能帮我从数字(代码)中对其他元素进行排序吗

代码:

#包括locale.h
#包括stdio.h
#包括string.h
int main(void){
setlocale(葡萄牙语);
int aux=0,i,j;
结构护墙板{
int codigo;
char titulo[40];
}利夫罗[10];
对于(i=0;i<10;i++){
printf(“Código%d:,i”);
scanf(“%d”,&livro[i].codigo);
fflush(stdin);
printf(“Título%d:,i”);
获取(livro[i].titulo);
}  
对于(i=0;i<10;i++){
对于(j=i+1;j<10;j++){
如果(livro[i].codigo>livro[j].codigo){
aux=livro[i].codigo;
livro[i].codigo=livro[j].codigo;
livro[j].codigo=aux;
}  
}  
}  
对于(i=0;i<10;i++){
printf(“%d%s\n”,livro[i].codigo,livro[i].titulo);
}  
}  

您应该交换整个结构,而不仅仅是它的第一个成员:

for(unsigned i = 0; i < n_livros; i++)  
{  
    for(unsigned j = i + 1; j < n_livros; j++)  
    {  
        if(livro[i].codigo > livro[j].codigo)  
        {  
            struct dados aux = livro[i];  
            livro[i] = livro[j];  
            livro[j] = aux;  
        }  
    }  
}  
for(无符号i=0;ilivro[j].codigo)
{  
结构护墙板aux=livro[i];
livro[i]=livro[j];
livro[j]=aux;
}  
}  
}  
正如Olaf所评论的那样,
flush(stdin)是未定义的行为,请不要这样做。

另外,请注意,
gets()
首先在C99中被弃用,然后从C11中删除。您应该使用执行边界检查的函数,如
fgets()
,并始终检查其(和
scanf()
)返回值。

代码中存在多个问题:

  • 您的
    #include
    行中存在语法错误
  • 读取循环不正确:您没有检查
    scanf()
    的返回值,您使用了过时的函数
    gets()
    ,该函数将只读取输入流中由
    scanf()
    留下的挂起换行符。读取到数组中的数据将不正确,并且行为可能未定义
  • fflush(stdin)具有未定义的行为
  • 在排序循环中,只交换
    codigo
    字段的值,而不交换数组元素。你正在破坏数据。您应该交换结构
以下是修改后的版本:

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

int main(void) {  
    setlocale(LC_ALL, "Portuguese");  // probably incorrect?
    int i, j;  
    struct dados {  
        int codigo;  
        char titulo[40];  
    } livro[10];

    for (i = 0; i < 10; i++) {  
        printf("Código %d: ", i);
        if (scanf("%d", &livro[i].codigo) != 1)
            return 1;
        printf("Título %d: ", i);
        if (scanf(" %39[^\n]", livro[i].titulo) != 1)
            return 1;
    }  
    for (i = 0; i < 10; i++) {  
        for (j = i + 1; j < 10; j++) {  
            if (livro[i].codigo > livro[j].codigo) {  
                struct dados aux = livro[i];  
                livro[i] = livro[j];  
                livro[j] = aux;  
            }  
        }  
    }  
    for (i = 0; i < 10; i++) {  
        printf("%d %s\n", livro[i].codigo, livro[i].titulo);  
    }
    return 0; 
}  
#包括
#包括
#包括
int main(void){
setlocale(LC_ALL,“葡萄牙语”);//可能不正确?
int i,j;
结构护墙板{
int codigo;
char titulo[40];
}利夫罗[10];
对于(i=0;i<10;i++){
printf(“Código%d:,i”);
if(scanf(“%d”,&livro[i].codigo)!=1)
返回1;
printf(“Título%d:,i”);
if(scanf(“%39[^\n]”,livro[i].titulo)!=1)
返回1;
}  
对于(i=0;i<10;i++){
对于(j=i+1;j<10;j++){
如果(livro[i].codigo>livro[j].codigo){
结构护墙板aux=livro[i];
livro[i]=livro[j];
livro[j]=aux;
}  
}  
}  
对于(i=0;i<10;i++){
printf(“%d%s\n”,livro[i].codigo,livro[i].titulo);
}
返回0;
}  

这是一个英语网站。请用那种语言提问。如果这是不可能的,你应该改为在发布。旁注:
fflush(stdin)->未定义的bahviour(不要!)使用所有警告和调试信息编译
gcc-Wall-Wextra-g
并使用调试器
gdb
您需要学习C的新来源。您当前的来源是垃圾,教您错误的练习。@GustavoFrancoFadel:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。
#include <locale.h>
#include <stdio.h>
#include <string.h> 

int main(void) {  
    setlocale(LC_ALL, "Portuguese");  // probably incorrect?
    int i, j;  
    struct dados {  
        int codigo;  
        char titulo[40];  
    } livro[10];

    for (i = 0; i < 10; i++) {  
        printf("Código %d: ", i);
        if (scanf("%d", &livro[i].codigo) != 1)
            return 1;
        printf("Título %d: ", i);
        if (scanf(" %39[^\n]", livro[i].titulo) != 1)
            return 1;
    }  
    for (i = 0; i < 10; i++) {  
        for (j = i + 1; j < 10; j++) {  
            if (livro[i].codigo > livro[j].codigo) {  
                struct dados aux = livro[i];  
                livro[i] = livro[j];  
                livro[j] = aux;  
            }  
        }  
    }  
    for (i = 0; i < 10; i++) {  
        printf("%d %s\n", livro[i].codigo, livro[i].titulo);  
    }
    return 0; 
}