2015-11-01 411 views
0

我目前正在進行一項任務,並且很好奇這個警告在編譯和如何補救時發生了什麼。它會建立,但是當我調試它會得到一個錯誤屏幕。以下是出現的警告。C4473結構分配警告

1> C:\用戶\ cesteves \文件\ C 編程\庫存\庫存\ inventory.cpp(48):警告C4473: 'scanf_s':沒有足夠的參數傳遞的格式字符串

注:佔位符和它們的參數期望2個可變參數, 但1被提供

注:缺少的可變參數的參數2由格式字符串所需 「%s」的注意:該參數被用作緩衝器大小

#include "stdafx.h" 
#include <stdio.h> 

void main() 
{ 
    struct date { 
     int day; 
     int month; 
     int year; 
    }; 

    struct details { 
     char name[20]; 
     int price; 
     int code; 
     int qty; 
     struct date mfg; 
    }; 

    struct details item[50]; 
    int n, i; 

    printf("Enter number of items:"); 
    scanf_s("%d", &n); 

    for (i = 0; i < n; i++) { 
     printf("Item name: \n"); 
     scanf_s("%s", item[i].name); 
     printf("Item code: \n"); 
     scanf_s("%d", &item[i].code); 
     printf("Quantity: \n"); 
     scanf_s("%d", &item[i].qty); 
     printf("price: \n"); 
     scanf_s("%d", &item[i].price); 
     printf("Manufacturing date(dd-mm-yyyy): \n"); 
     scanf_s("%d-%d-%d", &item[i].mfg.day, &item[i].mfg.month, &item[i].mfg.year);  
    } 

    printf("    ***** INVENTORY ***** \n"); 
    printf("----------------------------------------------------------------- - \n"); 
    printf("S.N.| NAME   | CODE | QUANTITY | PRICE| MFG.DATE \n"); 
    printf("----------------------------------------------------------------- - \n"); 

    for (i = 0; i < n; i++) 
     printf("%d  %-15s  %-d   %-5d  %-5d%d/%d/%d \n", i + 1, item[i].name, item[i].code, item[i].qty,item[i].price, item[i].mfg.day, item[i].mfg.month,item[i].mfg.year); 
    printf("----------------------------------------------------------------- - \n"); 
} 
+1

'scanf_s'是安全的scanf。需要緩衝區大小。 'scanf_s(「%s」,item [i] .name,20); ' –

+0

是的,它做到了 – Chris

回答

5

您應該提供緩衝區的大小。例如,如果您只讀取一個字符,它應該是這樣的:

char c; 
scanf_s("%c", &c, 1); 

請閱讀ref

另外,structs很高興放在main()之前。我總是有我的example,在structs的基本用法。

對於你的情況,main的原型應該是int main(void)。檢查:int main() vs void main() in C


在你的代碼,更改此:

scanf_s("%s", item[i].name); 

這樣:

scanf_s("%s", item[i].name, 20); 

因爲這樣:

struct details { 
    char name[20]; 
    .. 

執行相同的其餘..

+0

爲了什麼而投降?如果出現問題,請告訴我爲將來的用戶更新... – gsamaras

+0

我欣賞幫助並更正了結構的位置 – Chris

+0

@Chris我用結構示例更新了。很高興幫助您+1,花時間編輯您的帖子。 – gsamaras

1
scanf_s("%s", item[i].name);  

scanf_s需要的尺寸與符%s%c%[第三個參數。

你需要寫這樣的 -

scanf_s("%s", item[i].name,20); 

類似,採取輸入一個字符傳遞1的大小。

+0

工作感謝 – Chris

+0

嗨,很好的回答,+1。實際上它與我的非常相似,但我有一個downvote,所以我可能會有一個錯誤。你能看到任何請求嗎? – gsamaras

+0

@gsamaras我看不到任何。那麼,所有人都可以說它發生在SO上,它的一部分:-) – ameyCU