C/Visual C - Es normal que un printf me pida un "&"???

 
Vista:

Es normal que un printf me pida un "&"???

Publicado por Julian (11 intervenciones) el 23/02/2019 21:19:23
tengo un struct que dentro de un IF me pide un "&" dentro de un printf para reconocer las variable, si no lo coloco o aparece la variable sin un caracter o solo aparece un caracter de esa variable. Es normal eso? Lenguaje C en Qt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
enum { N_PERSONAS = 3};
 
struct Listado {
 
    char nombre;
    int edad;
 
};
 
int main(void) {
    struct Listado per[ N_PERSONAS ] = { {0} };
    char a;
    int b;
 
    a = per->nombre;
    b = per->edad;
 
    printf("Ingrese los datos de las personas:\n");
 
   for (int i = 0; i < N_PERSONAS; ++i){
 
    printf("Nombre: ");
    scanf("%s", &a);
     printf("\n");
    printf("Edad: ");
    scanf("%d", &b);
  }
    if(b > 25){
 
        printf("MAYOR DE 25:\t");
        printf("%s \n\n", &per->nombre);  //aca, ven, me pide un ampersam, si lo ejecutan se daran cuenta
    }else{
 
        printf("MENOR DE 25:\t");
        printf("%s \n\n", &per->nombre); //aca tambien lo pide
  }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Es normal que un printf me pida un "&"???

Publicado por Nacho (76 intervenciones) el 24/02/2019 08:18:38
No tienes más que ver el código en ensamblador que genera una cosa y otra.

printf("%s \n\n", &per->nombre); //aca tambien lo pide
00D619EB lea eax,[per] // en eax está la dirección de memoria del primer char de per, que es donde comienza la estructura per.
00D619EE push eax
00D619EF push 0D6CA44h
00D619F4 call _printf (0D613F7h)
00D619F9 add esp,8

printf("%s \n\n", per->nombre); //aca tambien lo pide
00D619FC movsx ecx,byte ptr [per] // en ecx está per[0]->nombre
00D61A00 push ecx
00D61A01 push 0D6CA4Ch
00D61A06 call _printf (0D613F7h)
00D61A0B add esp,8

Al printf hay que pasarle la dirección de memoria donde empiezan los datos, que es lo que hace &per->nombre.
per->nombre lo que le pasa es el valor del nombre de per[0], per[0].nombre, así que da un error al ejecutarlo.

Eso pasa porque per es una estructura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 22
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Es normal que un printf me pida un "&"???

Publicado por Alfil (9 intervenciones) el 24/02/2019 19:23:33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
 
const int N_PERSONAS = 3;
 
struct Listado {
 
    char nombre[10];
    int edad;
};
 
void Leer( Listado per[] ){
 
    printf("Ingrese los datos de las personas:");
 
    for ( int i = 0; i < N_PERSONAS; ++i ){
        printf("\nNombre: ");
        scanf("%s", &per[i].nombre);
        printf("Edad: ");
        scanf("%d", &per[i].edad);
    }
}
 
const void Imprimir( Listado per[] ){
 
    printf("\n\nMAYOR DE 25:");
    for( int i = 0; i < N_PERSONAS; ++i ){
        if(  per[i].edad > 25 )
            printf( "\n%s", per[i].nombre );
    }
 
    printf("\n\nMENOR DE 25:");
    for( int i = 0; i < N_PERSONAS; ++i ){
        if(  per[i].edad < 25 )
            printf( "\n%s", per[i].nombre );
    }
    printf( "\n\n" );
}
 
int main(void) {
 
    struct Listado per[ N_PERSONAS ] = {0};
 
    Leer( per );
    Imprimir( per );
 
    return 0;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar