2014-01-17 2 views
3

Я нахожусь в классе программирования в Техасском техническом университете, и после того, как я поработал с Python в прошлом семестре, я, наконец, в классе C++. В то время как мы делали программу HelloWorld в классе сегодня, я и некоторые другие получили Microsoft Visual Studio 2013, говорящие нам использовать scanf_s вместо scanf, как это использовал инструктор в своей программе. Ниже мой код в его нынешнем виде.Почему VS2013 говорит мне использовать scanf_s?

#include <stdio.h> 
int main(){ 

int i,j; 
float x,y; 
scanf("input a number: %d %d %f %f", &i, &j, &x, &y); 

printf("print numbers a : %d \n",i); 
printf("print numbers a : %10.3d \n", i); 
printf("print numbers a : %-10.3d", i); 

fflush(stdin); 
getchar(); 
return 0; 
} 
+1

Я бы сказал, что ... не используйте его, если вы не согласны с не переносимым кодом: afaik, это микрософт думает - я считаю, что это просто «безопасная» версия scanf ... хорошее намерение, но ... – ShinTakezou

+0

['scanf_s'] (http://msdn.microsoft.com/en-us/library/w40768et.aspx) - это расширение Visual Studio, которое должно иметь дополнительные улучшения безопасности. Это * не * переносится за пределы Visual Studio. –

+0

Избегайте проблемы, вы используете C++, поэтому используйте std :: cin и std :: cout. Boom. – kfsone

ответ

9

The _s family of functions являются "обеспечить" варианты стандартных библиотечных функций, предоставляемых Microsoft. Многие стандартные функции библиотеки не считаются безопасными, поскольку они либо не позволяют, либо не требуют от пользователя защиты от переполнения буфера. Функции _s являются альтернативами, которые позволяют/требуют защиты переполнения буфера (обычно это означает, что они принимают дополнительный аргумент, определяющий размер буфера, который вы передаете, но в случае scanf_s() он требует, чтобы строка формата содержала спецификаторы ширины для каждого %c, %C, %s или %S параметр).

Вы можете отключить эти предупреждения, установив _CRT_NONSTDC_NO_WARNINGS в настройках вашего проекта. Или, если вы выберете, переключитесь на функции _s (но учтите, что это приведет к привязке вашего кода к библиотекам времени исполнения Microsoft [или к C11, см. Комментарии ниже] и сделает его непереносимым).

+2

На самом деле, они не полностью Microsoft-only; они являются необязательной частью стандарта C11. – Angew

+0

@Angew Интересно. Реализация Microsoft на 100% совместима со стандартом C11? Они были дольше ... – TypeIA

+1

Я не знаю, на самом деле не проверил. Я знаю, что есть один случай, когда стандартный обменный порядок параметров по сравнению с функцией MS (не помню, какой из них имеет MSDN), но я считаю, что общая идея заключалась в том, чтобы они были одинаковыми. – Angew

Смежные вопросы