【问题标题】:it shows output more than 4 times它显示输出超过 4 次
【发布时间】:2020-07-29 17:10:16
【问题描述】:

我试图用 C 语言编写一个程序,该程序基本上会询问用户有关他们所居住的人的一些信息。代码是西班牙语,但我会告诉你问题。

    /*Miembros de la familia*/
#include<stdio.h>
#include<stdbool.h>
#define TRUE 1
#define FALSE 0

int main(){
    
    int personas,i,varones=0,hembras=0,opcion;
    bool mayoredad=false;
    

    printf("Indique cuantas personas viven en su casa:\n");
    scanf("%i", &personas);

    
    struct nombre{
        char primer[30];
        char segundo[30];
        char apellido[30];
    }minombre;
    
    struct fecha{
        int dia;
        int mes;
        int anio;
    }nacimiento, actual;
    
    printf("\nIngrese la fecha actual:\n");
    scanf("%i %i %i", &actual.dia, &actual.mes, &actual.anio);
    
    
    struct familia{
        struct nombre minombre;
        char cedula[10];
        struct fecha nacimiento;
        char genero;
        int edad;
    }familia[personas];
    
    
    for(i=0;i<personas;i++){
        printf("\nIndique su primer nombre, segundo nombre y apellido:\n");
        scanf("%s %s %s", &familia[i].minombre.primer, &familia[i].minombre.segundo, &familia[i].minombre.apellido);
        printf("\nPor favor escriba su numero de cedula:\n");
        scanf("%s", &familia[i].cedula);
        do{
        printf("\nIngrese la fecha de su nacimiento: (DD)(MM)(AAAA):\n");
        scanf("%i %i %i", &familia[i].nacimiento.dia, &familia[i].nacimiento.mes, &familia[i].nacimiento.anio);
        if(familia[i].nacimiento.anio>actual.anio){
            printf("Dato invalido, por favor intente nuevamente.");
        }
        }while(nacimiento.anio>actual.anio);
        familia[i].edad=actual.anio-familia[i].nacimiento.anio;
            if(familia[i].nacimiento.mes>=actual.mes && familia[i].nacimiento.dia>actual.dia){
                familia[i].edad--;
            }
            if(familia[i].edad>=18){
                mayoredad=true;
            }
        do{
            printf("Indique su genero: (f) o (m):");
            scanf(" %c", &familia[i].genero);
            if(familia[i].genero=='f'){
                hembras++;
            }else if(familia[i].genero=='m'){
                varones++;
            }
        }while(familia[i].genero!='f' && familia[i].genero!='m');       
    }
    
    do{
    printf("Registro concluido. Desea ver las estadisticas? 1(si) 2(no)");
    scanf("%i", &opcion);
    if(opcion!=1 && opcion!=2){
        printf("DATO INVALIDO, INTENTE NUEVAMENTE");
    }else if(opcion==1){
        for(i=0;i<personas;i++){
            printf("Nombre: %s %s %s\n", familia[i].minombre.primer, familia[i].minombre.segundo, familia[i].minombre.apellido);
            printf("Cedula:%s\n", familia[i].cedula);
            printf("Edad:%i\n", familia[i].edad);
            printf("Mayor de edad:\n");
            switch(mayoredad){
                case true:printf("Si");break;
                case false:printf("No");
            }
        }
        printf("Cantidad de personas en el hogar: %i\n", personas);
        printf("Varones: %i    Hembras: %i\n", varones, hembras);
    }
    }while(opcion>=2 && opcion<0);
        
    printf("Presione una tecla para salir.");
    getchar();
    return 0;
}

在请求人的性别的最后一个 do-while 循环中 (familia[i].genero) 它应该只问一次,但在 for 循环的最后一次迭代中,它会显示四次相同的问题:enter image description here 我该如何解决这个问题?

【问题讨论】:

  • 我们对每个人都彬彬有礼,无论是初学者还是其他人。
  • 您的代码有几个编译器警告。我建议你先解决这些问题。特别是,您不要在 scanf 中将 & 符号与字符数组一起使用。见repl.it/@robertwharvey/VerifiableVividTrapezoid
  • 条件opcion&gt;=2 &amp;&amp; opcion&lt;0 永远不会成立。

标签: c loops do-while


【解决方案1】:

格式说明符%i 会将后缀为0(而不是0x0X)的输入视为八进制数。

因此,您输入中的09 作为八进制数无效,它将在流中留下9

这个9 被下一个说明符读取为familia[i].nacimiento.anio

然后,跟随scanf(" %c", &amp;familia[i].genero); 将从输入中读取2003,这将导致4 个额外的询问。

要解决此问题,请使用 %d 说明符来读取整数。 %d spcifier 会将输入视为十进制数,无论后缀如何。

【讨论】:

  • 天哪,谢谢。它还修复了年龄(已死亡)以及此人是否未成年的错误。
  • (edad)* 西班牙语年龄
  • 实际上我这样做了,但现在它在 for 循环的第一次迭代中准确地显示了该消息两次。上一个 bug 总是 presnet 在最后一个
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2014-01-26
  • 2022-01-22
  • 2013-08-20
相关资源
最近更新 更多