gpt4 book ai didi

c - scanf 不断被跳过

转载 作者:行者123 更新时间:2023-11-30 17:15:02 25 4
gpt4 key购买 nike

在我在函数“leerdatos”中格式化“direction”的 scanf 后,它会跳过第二个“for”循环中的“nro_corredor”。

我已经阅读了相关问题,但仍未得到答案。

我该如何解决这个问题?

#include <stdio.h>

typedef struct {
int minutos;
int segundos;
} s_tiempo;

typedef struct {
int nro_corredor; // guarda nro de corredor
s_tiempo tiempo; // guarda el tiempo que tardo el corredor
} carrera;

typedef struct {
int nro_corredor; // guarda nro de corredor
char apellido[20];
char nombres[20];
char direccion[30];
} datos;

datos leerdatos(); //declaro la funcion leer

int main (void) {
int cp; //cantidad de participantes.
datos aux;
printf("Ingrese la cantidad de participantes: ");
scanf("%d",&cp);
datos corredor[cp];
carrera carreras[cp];
printf("A continuacion, ingrese los datos de los corredores: \n");
for(int i=0;i<cp;i++){
aux = leerdatos();
corredor[i] = aux;
}
}

datos leerdatos(void) {
datos participante;
printf("\nIngrese el numero de corredor: ");
scanf("%d",&participante.nro_corredor);
printf("\nIngrese el apellido:\n");
scanf("%s",participante.apellido);
printf("\nIngrese los nombres:\n");
scanf("%s",participante.nombres);
printf("\nIngrese la direccion:\n");
scanf(" %s\n",participante.direccion);
return(participante);
}

最佳答案

scanf() 的错误使用

// scanf(" %s\n", ...
scanf("%s", ...

'\n' 这样的空格"%s"之后指挥scanf()寻找空白,直到后面出现非空白。该非空白空间被放回到 stdin 中。这可能意味着 OP 必须输入 2 Enter 作为第四个输入。

应始终检查 scanf()返回值以查看是否符合预期。

// scanf("%d",&participante.nro_corredor);
if (scanf("%d",&participante.nro_corredor) != 1) Handle_Error();

"%s"前加一个空格或"%d"scanf()没有区别。即使没有前导 " ",这些说明符也会消耗可选的空白区域。 .

推荐使用fgets()读取用户输入(这是邪恶),然后使用 sscanf() 进行解析, strtok() , strtol()

<小时/>

注意:扫描集中除外 "%[...]" ,空白如 ' ' , '\t' , '\n' ,其他人都执行相同:它们消耗任意数量的空白。那'\n'scanf(" %s\n",... 扫描 1 '\n' 。它扫描任意数量的任意空白。它将继续扫描空白,包括多个 Enter 直到输入 EOF 或非空白。然后将该非空白放回 stdin作为要读取的下一个“字符”。

关于c - scanf 不断被跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072944/

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