基本上我有一个结构
typedef struct {
const char *nome;
const char *apelido;
int numero;
} Aluno;
我希望按numero
排序。
例如,输入:
jonhy_james_123
jack_china_111
输出:
jack_china_111
jonhy_james_123
我已成功完成此操作,但我没有使用一个CTRL + Z来打破文件末尾 不知何故需要做两次。
以下是完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <string.h>
typedef struct {
const char *nome;
const char *apelido;
int numero;
} Aluno;
Aluno aluno(const char *nome, const char *apelido, int numero)
{
Aluno result;
result.nome = nome;
result.apelido = apelido;
result.numero = numero;
return result;
}
Aluno *Aluno_new (int n)
{
return (Aluno *) malloc (n * sizeof(Aluno));
}
char *str_dup(const char *s)
{
char *result = (char *) malloc(strlen(s) + 1);
strcpy(result, s);
return result;
}
int aluno_read(Aluno *a)
{
int result = 0;
char nome[50];
char apelido[50];
int numero;
while (scanf("%[^_]_%[^_]_%d\n", nome, apelido, &numero) != EOF) {
a[result++] = aluno(str_dup(nome), str_dup(apelido), numero);
}
return result;
}
void aluno_write(Aluno *a, int n)
{
printf("%s_%s_%d\n", a[0].nome, a[0].apelido, a[0].numero);
for (int i = 1; i < n; i++) {
printf("%s_%s_%d\n", a[i].nome, a[i].apelido, a[i].numero);
}
}
int qsort_cmp_numero(Aluno *x, Aluno *y)
{
return (x->numero - y->numero);
}
int cmp_B(Aluno *x, Aluno *y)
{
int result = qsort_cmp_numero(x,y);
return result;
}
int cmp_final2(const void *p, const void *q)
{
return cmp_B((Aluno *) p, (Aluno *) q);
}
void test_sort()
{
Aluno *aluno = Aluno_new(100001);
int n_aluno = aluno_read(aluno);
qsort(aluno, n_aluno, sizeof(Aluno), cmp_final2);
aluno_write(aluno, n_aluno);
}
int main()
{
test_sort();
return 0;
}
答案 0 :(得分:1)
虽然Windows中Ctrl-Z
的行为有一些特点,但目前这是次要的。
主要问题是您在\n
格式的末尾放置了scanf
个字符。通过这样做,您要求scanf
在&#34; primary&#34;之后等待非空输入。部分输入完成。
这本身很容易导致&#34;奇怪&#34;你scanf
的行为,比如&#34;忽略&#34; Enter
密钥等。
\n
在那里做什么?为什么要将它包含在格式字符串中?