我正在尝试从用户将要输入的数字(代码)中对结构进行排序,并且我正在使用冒泡排序。我希望程序打印按数字(代码)排序的所有数据,但它只对数字(代码)进行排序。有人可以帮我从数字(代码)中排序其他元素吗?
CODE:
#include locale.h
#include stdio.h
#include string.h
int main(void) {
setlocale(LC_ALL, "Portuguese");
int aux = 0, i, j;
struct dados {
int codigo;
char titulo[40];
} livro[10];
for (i = 0; i < 10; i++) {
printf("Código %d: ", i);
scanf("%d", &livro[i].codigo);
fflush(stdin);
printf("Título %d: ", i);
gets(livro[i].titulo);
}
for (i = 0; i < 10; i++) {
for (j = i + 1; j < 10; j++) {
if (livro[i].codigo > livro[j].codigo) {
aux = livro[i].codigo;
livro[i].codigo = livro[j].codigo;
livro[j].codigo = aux;
}
}
}
for (i = 0; i < 10; i++) {
printf("%d %s\n", livro[i].codigo, livro[i].titulo);
}
}
答案 0 :(得分:2)
您的代码中存在多个问题:
#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;
}
答案 1 :(得分:1)
你应该交换整个结构,而不仅仅是它的第一个成员:
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;
}
}
}
正如奥拉夫评论的那样,flush(stdin);
是未定义的行为,只是不这样做
另请注意,gets()
首先在C99中弃用,然后从C11中删除。您应该使用执行边界检查的函数,例如fgets()
并始终检查其(和scanf()
)的返回值。