2015-11-01 3 views
0

В настоящее время я работаю над заданием, и мне было любопытно, что это предупреждение при компиляции и как его исправить. Он будет построен, но когда я отлажу, он получит экран с ошибкой. Ниже приведено предупреждение.C4473 предупреждение о назначении структуры

1> C: \ Users \ cesteves \ документы \ с программирования \ инвентаризации \ инвентаризации \ inventory.cpp (48): предупреждение C4473: 'scanf_s': не достаточно аргументов передается строка формата

примечание: заполнители и их параметры ожидают 2 VARIADIC аргументы, но 1 были предоставлены

примечание: отсутствует VARIADIC аргумент 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.

Прототипом основного должно быть 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 Я обновил пример для structs. Рад, что это помогло, +1 за то, что уделили время для редактирования вашего сообщения. – gsamaras

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

scanf_s требуют Таблица размеров как 3-го аргумента с спецификаторов %s, %c и %[.

Вам нужно написать, как это -

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

Похоже, для принятия ввода одного символа проходят 1 как размер.

+0

Это сработало спасибо – Chris

+0

Привет, хороший ответ, +1. На самом деле это действительно похоже на мое, но у меня есть нисходящая линия, поэтому у меня может быть ошибка. Вы видите, пожалуйста? – gsamaras

+0

@gsamaras Я не вижу ничего. Ну, все могли сказать, что это произойдет на SO, его часть :-) – ameyCU