C El formato ‘% d’ espera un argumento del tipo ‘int *’ pero el argumento 2 tiene el tipo ‘unsigned int’

Tengo algún problema con este código, quiero comstackr esto pero no es comstackr porque algo esté mal. Dije sobre el código incorrecto ahí abajo …

#include  #include  #include  #define MAX 1000 typedef struct{ int film_id; char title[255]; char description[1023]; unsigned int release_year; char rental_duration; float rental_rate; unsigned char length; float replacement_cost; char rating[10]; char last_update[30]; } RECORD_t, *RECORD; int main(){ int i,R1; char R[1]; RECORD rec = (RECORD)malloc(sizeof(RECORD_t)*MAX); FILE *file = fopen("data.txt", "rb"); if (file == NULL) { printf("Cannot open the file.\n"); exit(0); } fread(rec, sizeof(RECORD_t)*MAX, 1, file); fclose(file); printf("İd Numarası Giriniz : \n"); scanf("%d",&R1); for (i=0; i<1000; i++){ if (R1 == rec[i].film_id) { printf("TITLE: %s\n", rec[i].title); printf("Enter New TITLE : "); scanf("%s",rec[i].title); printf("DESCRIPTION: %s\n", rec[i].description); printf("Enter New Description : "); scanf("%s",rec[i].description); // My problem is this line :------------------- printf("RELEASE YEAR: %d\n", rec[i].release_year); printf("Enter New RELEASE YEAR : "); scanf("%d",rec[i].release_year); printf("RENTAL DURATION: %d\n", rec[i].rental_duration); printf("Enter New RENTAL DURATION : "); scanf("%d",rec[i].rental_duration); printf("RENTAL RATE: %f\n", rec[i].rental_rate); printf("Enter New RENTAL RATE : "); scanf("%f",rec[i].rental_rate); printf("REPLACEMENT COST: %f\n", rec[i].replacement_cost); printf("Enter New REPLACEMENT COST : "); scanf("%f",rec[i].replacement_cost); printf("RATING: %s\n", rec[i].rating); printf("Enter New RATING : "); scanf("%s",rec[i].rating); printf("LAST UPDATE: %s\n", rec[i].last_update); printf("Enter New LAST UPDATE : "); scanf("%s",rec[i].last_update); } } } file = fopen("data.txt", "wb"); fwrite(rec, sizeof(RECORD_t)*MAX, 1, file); fclose(file); free(rec); return 1; } 

solo las variables int y float no funcionan mientras estaba comstackndo

 warning: format '%d' expects argument of type 'int *', but argument 2 has type 'unsigned int' [-Wformat=] printf("RELEASE YEAR: %d\n", rec[i].release_year); printf("Enter New RELEASE YEAR : "); scanf("%d",rec[i].release_year); ^ 

Por favor, ayúdame ://

Los especificadores de formato %d y %f para scanf esperan la dirección de int y float respectivamente. También release_year es un unsigned int , por lo que se debe usar el especificador %u , y para rental_duration , que es un char , se debe %hhd .

Así que estos:

 scanf("%d",rec[i].release_year); scanf("%d",rec[i].rental_duration); scanf("%f",rec[i].rental_rate); scanf("%f",rec[i].replacement_cost); 

Debe cambiarse a:

 scanf("%u",&rec[i].release_year); scanf("%hhd",&rec[i].rental_duration); scanf("%f",&rec[i].rental_rate); scanf("%f",&rec[i].replacement_cost); 

No está viendo un problema con %s porque las matrices, cuando se pasan a una función, se descomponen en un puntero al primer elemento de la matriz.

EDITAR:

Usar el especificador de tamaño adecuado para scanf es de particular importancia. Si utilizara %d lugar de %hhd para un char , scanf intentará escribir en una ubicación de 4 bytes (suponiendo que int es de 32 bits) en lugar de en un byte, lo que conducirá a un comportamiento indefinido.

De la página del manual:

  h Indicates that the conversion will be one of diouxX or n and the next pointer is a pointer to a short int or unsigned short int (rather than int). hh As for h, but the next pointer is a pointer to a signed char or unsigned char. l Indicates either that the conversion will be one of diouxX or n and the next pointer is a pointer to a long int or unsigned long int (rather than int), or that the conversion will be one of efg and the next pointer is a pointer to double (rather than float). Specifying two l characters is equivalent to L. If used with %c or %s the corresponding parameter is considered as a pointer to a wide character or wide character string respectively. L Indicates that the conversion will be either efg and the next pointer is a pointer to long double or the conversion will be dioux and the next pointer is a pointer to long long. 

Debe pasar la dirección de la variable cuando llama a scanf()

 scanf("%d", &rec[i].release_year); 

Obviamente, su problema proviene de scanf("%d",rec[i].release_year); .

El scanf necesita un puntero a su variable para poder almacenar el valor de lectura en ella. Entonces debe ser: scanf("%d",&(rec[i].release_year));

Nota: no pongas varios comandos en la misma línea. Su herramienta le indicó la línea con el error, no la función que lo generó. Si hubieras dividido esta línea en 3 (printf + printf + scanf) habrías visto más rápido dónde está el problema 🙂