У меня проблемы с несколькими символами и scanf_s()

Я пытаюсь использовать scanf_s() для чтения нескольких значений, но каждый раз, когда я запускаю программу, я получаю

Необработанное исключение по адресу 0x592AD6AC (msvcr120d.dll) в лаборатории 2.exe: 0xC0000005: место записи нарушения прав доступа 0x00000000.

во всплывающем окне. Как это исправить?

float inTemp;
char inUnit;
char outUnit;

printf("Please enter the starting temperature with its units and the units\nyou would like to convert to (i.e. 74.5 F C): ");
scanf_s("%f %c %c", &inTemp, &inUnit, &outUnit); //takes in all user input (NOT WORKING)

person dolphinex2    schedule 07.08.2014    source источник
comment
Проверьте материалы о scanf_s() еще раз, пожалуйста,   -  person πάντα ῥεῖ    schedule 07.08.2014
comment
Подумайте о том, чтобы поместить #define _CRT_SECURE_NO_WARNINGS поверх ваших исходных файлов и использовать вместо него scanf для переносимого кода.   -  person Utkan Gezer    schedule 07.08.2014


Ответы (2)


Вы не указали индикатор длины. Из MSDN:

В отличие от scanf и wscanf, scanf_s и wscanf_s требуют указания размера буфера для всех входных параметров типа c, C, s, S или строковых управляющих наборов, заключенных в []. Размер буфера в символах передается как дополнительный параметр сразу после указателя на буфер или переменную. Например, если вы читаете строку, размер буфера для этой строки передается следующим образом: char s[10]; scanf_s("%9s", s, _countof(s)); // размер буфера равен 10, спецификация ширины равна 9

Вот ссылка на эту страницу.

person Logicrat    schedule 07.08.2014

Если вы действительно хотите использовать (менее портативный) scanf_s, из стандарта C11 (n1570), Приложение K 3.5.3.2 п.4:

Функция fscanf_s эквивалентна fscanf, за исключением того, что спецификаторы преобразования c, s и [ применяются к паре аргументов (если только подавление присваивания не указано *). Первый из этих аргументов такой же, как и для fscanf. Сразу после этого аргумента в списке аргументов следует второй аргумент, который имеет тип rsize_t и дает количество элементов в массиве, на который указывает первый аргумент пары.

Вам нужно указать длину ваших char * аргументов:

scanf_s("%f %c %c", &inTemp, &inUnit, 1, &outUnit, 1);

В качестве альтернативы просто используйте scanf:

scanf("%f %c %c", &inTemp, &inUnit, &outUnit);

И, как всегда, проверьте возвращаемые значения.

В общем, так как scanf иногда полезен для небольших быстрых и грязных программ, он менее полезен для производительного программного обеспечения, потому что обработка ошибок затруднена. Вместо этого используйте fgets и sscanf/strtod/strtol/….

person mafso    schedule 07.08.2014