2015-11-01 80 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