C格式'%d'期望类型' int *'的参数但是参数2的类型为' unsigned int' [-Wformat =]

时间:2015-10-15 20:28:44

标签: c

我有一些关于这段代码的问题,我想编译它,但它不能编译,因为有些错误。我在那里讲错了代码...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

在编译时只有int和float变量不起作用

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);
    ^

请帮帮我://

3 个答案:

答案 0 :(得分:6)

%d的{​​{1}}和%f格式说明符分别指向scanfint的地址。另外,floatrelease_year,因此应使用unsigned int说明符,对于%urental_durationchar应该是使用

所以这些:

%hhd

应改为:

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

你没有看到scanf("%u",&rec[i].release_year); scanf("%hhd",&rec[i].rental_duration); scanf("%f",&rec[i].rental_rate); scanf("%f",&rec[i].replacement_cost); 的问题,因为数组 - 传递给函数时 - 会衰减到指向数组第一个元素的指针。

编辑:

使用%s的正确大小说明符特别重要。如果您对scanf使用%d而不是%hhdchar将尝试写入4字节位置(假设scanf为32位而不是一个字节,这将导致未定义的行为。

从手册页:

int

答案 1 :(得分:4)

调用$(document).ready(function() { $('select').each(function() { val = $(this).find('option:selected').val(); $(this).prev().html(val); }); });

时,需要传递变量的地址
scanf()

答案 2 :(得分:2)

显然,您的问题来自scanf("%d",rec[i].release_year);

scanf需要一个指向变量的指针,以便能够将de读取值存储到其中。所以必须是:scanf("%d",&(rec[i].release_year));

注意:不要在同一行上放置几个命令。您的工具将您指向错误的行,而不是指向它的函数。如果您将此行拆分为3(printf + printf + scanf),您会看到更快的问题:)