为什么我必须两次执行ctrl + z才能打破文件末尾?

时间:2017-12-14 18:58:37

标签: c windows

基本上我有一个结构

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;
}

1 个答案:

答案 0 :(得分:1)

虽然Windows中Ctrl-Z的行为有一些特点,但目前这是次要的。

主要问题是您在\n格式的末尾放置了scanf个字符。通过这样做,您要求scanf在&#34; primary&#34;之后等待非空输入。部分输入完成。

这本身很容易导致&#34;奇怪&#34;你scanf的行为,比如&#34;忽略&#34; Enter密钥等。

\n在那里做什么?为什么要将它包含在格式字符串中?