gpt4 book ai didi

c - 为什么我必须按 ctrl+z 两次才能中断文件末尾?

转载 作者:行者123 更新时间:2023-11-30 14:52:00 26 4
gpt4 key购买 nike

基本上我有一个结构

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

最佳答案

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

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

这本身很容易导致 scanf 出现“奇怪”行为,例如“忽略”Enter 键等。

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

关于c - 为什么我必须按 ctrl+z 两次才能中断文件末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com