排序(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;
}