Scanf для двух строк и числа с плавающей запятой - PullRequest
0 голосов
/ 12 октября 2011

Я создаю меню, которое должно принимать три входа от пользователей.

    char *fullname;
    char *date;
    float sal;
    printf("\nEnter full name: ");

line92

scanf("%s", &fullname);
printf("\nEnter hire date: ");

Линия 94

scanf("%s", &date);
printf("\nEnter salary: ");

Линия 96

scanf("%d", &sal);

Это ошибки, которые я получаю

Employee.c:92: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:94: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:96: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’

Могу ли я получить объяснение причин этих проблем?

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Есть несколько проблем:

Во-первых:

Когда вы используете scanf для строк, вы не используете &. Так что просто scanf("%s", fullname);.

Второе:

Ваши указатели не инициализированы. Попробуйте вместо этого:

char fullname[256];
char date[256];

Это будет работать, если вы введете не более 255 символов.

Третье:

Ваш последний набранный scanf не совпадает. Вы передаете float, когда вы указали int в строке формата. Попробуйте это:

scanf("%f", &sal);
0 голосов
/ 12 октября 2011

Предупреждения довольно очевидны. Когда вы вызываете scanf со спецификатором формата %s, вам необходимо предоставить ему указатель на первый элемент массива char, в который можно скопировать строку. Вы этого не делаете, вместо этого вы даете ему адрес указателя на символ.

char[100] fullname;
scanf( "%s", fullname );

Та же проблема существует для даты. Также имейте в виду, что при использовании приведенного выше кода произойдет переполнение буфера, если пользователь введет строку длиной не более 100 символов.

Если вы используете MSVC, вы можете использовать функцию scanf_s, которая требует ввода длины буфера. Однако эта функция специфична для Microsoft и, следовательно, не переносима.

scanf_s( "%s", fullname, 100 );

Для зарплаты проблема заключается в том, что спецификатор формата - %d, который используется для чтения целых чисел, а не чисел с плавающей запятой. Используйте

scanf( "%f", &sal );
...