Scanf не работает visual studio
Почему Console.WriteLine не работает в коде Visual Studio?
У меня есть скрипты и кодернер, установленные в коде Visual Studio. Когда я запускаю простую программу, включающую Console.WriteLine("Test") , я ничего не вижу. Кажется, что программа успешно работает и завершает работу с кодом 0.
Вот весь код на случай, если кому-то будет интересно:
Если вы просто пытаетесь запустить файл CS без проекта и т. Д., Проблема заключается в том, что обработчик кода рассматривает файл как скрипт. Таким образом, основной метод на самом деле не вызывается так, как при запуске консольного приложения.
Поэтому решение состоит в том, чтобы сделать ваш метод main общедоступным и добавить вызов Program.Main (null); после определения класса. Это решение не требует никакого файла конфигурации launch.json или изменений конфигурации. Обратите внимание на вызов Program.Main после того, как определение класса действительно показывает ошибку в коде VS, но он прекрасно работает в коде запуска. Смотрите блок кода ниже.
Вы должны сделать это
Вам необходимо добавить любой из следующих строк кода
Код скомпилировался и затем запустился, но он не был очень быстрым, и консольное приложение закрылось после выполнения. Чтобы этого не случилось, вам нужно добавить еще один метод, например:
( Строка обозначает перевод строки, это означает, что курсор перемещается на следующую строку слева).
Таким образом, приложение закроется, если вы нажмете клавишу «Ввод» на клавиатуре.
Почему gets не работает в visual studio
Здравствуйте. У меня возникли проблемы с функцией gets().
Попробуй подключить данную библиотеку
попробуйте данный вариант
Так оно вообще не воспринимает русский. Хотя если переключить шрифт в консоли на Lucida Console все прекрасно работает. Но будет ли оно работать где либо, вне моего компьютера?
Хотя если изменить расположение файла, или поменять ему имя и т.д оно опять не работает, сбивается шрифт.
Функции gets и gets_s. В чем опасность
MSDN описывает функцию gets как устаревшую:
These functions are obsolete. Beginning in Visual Studio 2015, they are not available in the CRT. The secure versions of these functions, gets_s and _getws_s, are still available
Компилятор gcc также выдает предупреждение о том, что функция устаревшая:
warning: ‘char* gets(char*)’ is deprecated [-Wdeprecated-declarations]
В Linux man рассказано об опасностях использования этой функции:
Never use gets(). Because it is impossible to tell without knowing the
data in advance how many characters gets() will read, and because
gets() will continue to store characters past the end of the buffer, it
is extremely dangerous to use. It has been used to break computer
security. Use fgets() instead.
Таким образом, использование функции gets не рекомендуется нигде. Проблема функции в том, что она считывает данные в буфер до тех пор, пока не встретится символ конца строки, не учитывая размер буфера. Т.е., например, если мы выделим память под 25 символов, а пользователь введет строку из 40 символов, то следующие за строкой 15 байт будут перезаписаны. Такая ошибка может привести к чему угодно, причем программа может продолжать работать, но делать это неправильно (ошибку очень сложно выявить).
Описанные проблемы показаны следующим кодом:
Поля структуры располагаются в памяти последовательно, поэтому если пользователь введет название предмета более чем из семи символов (восьмым будет символ окончания строки), то стоимость предмета изменится:
Проблемы использования gets
char *fgets(char *s, int size, FILE *stream);
Заменив в приведенном выше коде ввод данных на
fgets(item.name, 8, stdin);
Мы получим другой вывод программы (теперь вводится только часть имени предмета, но не портятся данные и программа остается корректной.
Except that it doesn't run, neither on the vscode output or cmd. it doesn't even print the "Enter any character" from line 5, it show that the code is running, but doesn't even accept inputs (and will only halt once I click the Stop Code Run button)
scanf("%s", &str); is wrong. It should be scanf("%s", str); . But I doubt that's preventing it from working properly. (And before you say "But I thought I always needed & with scanf , yes, that's true, except that %s is an exception to that rule. This is one of the many, many annoying things abut scanf .)
@SteveSummit, I consider myself a seasoned C programmer, and I occasionally use scanf . Indeed, I consider it a mark of my seasoning that I know when that's a reasonable thing to do (not particularly often) and how to make scanf work safely and reliably for me when I do choose to use it.
Please show exactly what you entered. Did you type one character key, and then press the
@ChaoticNeutralFurry I don't know anything abut vscode, but I see lots of questions like yours. I don't know if its defaults or wrong, or there's an easy configuration mistake to make, or what, but we often hear that it's failing to run even the most basic programs. This is appallingly frustrating, because if you're just learning, you naturally assume you must have made a mistake.
6 Answers 6
There is an old question with a similar problem. (I tried to flag this as a duplicate but the open bounty blocked that.)
Excellent. Thanks very much. I hope this will be helpful to @ChaoticNeutralFurry. (And, unless I'm mistaken here, it looks like vscode has successfully adopted that lovely old pattern exemplified by: "Did you check the 'workCorrectly' option? No? No wonder it didn't work for you! It's not checked by default, you know.")
Is incorrect - it should be
- It has bounds - i.e. not array over bounds
- It is passing a char *
BTW - Might be a good idea to check the return value from scanf
@ChaoticNeutralFurry The point is that while I doubt the extra & is causing your problem, theoretically it does make your program's behavior undefined, so theoretically anything can happen. So to remove all doubt, you need to make that change, and rerun your program, and tell us whether you're still seeing the same result.
You can choose: Run->Add Configuration. -> launch.json change this: "externalConsole": true,
format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Wformat=] scanf("%s", &str);
Strings are represented as Array of characters thus array name is an identifier(implicit conversion to pointer) is the address of first element thus no need to specified '&' in case of reading strings.
Its clear from warning that it can't convert from char (*)[100] to char *
In C, a string is the address of the character buffer which is why we do not need "&" with the variable. Code with solution
Please post your code directly to the answer, no need of adding extra URLs that can become invalid in future.
My English is poor. I wish I can help you!!
scanf("%s", &str); this sentence is false. Do you know pointers, or Memory address?
If you know, suppose you are the creator of scanf. What you need to do is read what the user write in the screen and copy them to the space of the second argument. So, you don't care about the value of the second argument. What you care about is the address of the second argument. Then you can access this memory space. So, when the second argument is a variable, such as int a, you need to "&a". But str itself can be a address. So it do not need "&"
Возвращаемое значение
1-3) Количество успешно назначенных принимающих аргументов (которое может быть нулевым в случае, если сбой сопоставления произошел до того, как был назначен первый получающий аргумент), или EOF, если сбой ввода произошел до того, как был назначен первый получающий аргумент.
Вы игнорируете это возвращаемое значение.
. чтобы узнать, было ли сканирование успешным. Не делать это плохая идея и стоит того предупреждения, которое вы получили.
Слишком много здесь, чтобы добавить комментарий.
Я использую версию Visual C, но она никогда не жалуется на то, что возвращаемое значение из scanf не используется. Что он делает, это жалуется, что scanf небезопасно и не рекомендуется, когда это не так.
MS думает, что я должен использовать свою собственную "более безопасную" версию scanf_s , которая даже сложнее в использовании, и IMO вовсе не безопаснее — потому что это не простая замена, а принимает другие аргументы, и поэтому легко делать ошибки в его использовании.
Функция scanf() не работает
Здравствуйте, помогите решить проблему с функцией scanf(); Она не принимает значения в переменные вообще. Работаю в Visual Studio 2017. Пробовал по советам очищать поток и присваивать переменным значение int, не помогает.
Ошибка в данном месте
Функция scanf не работает
Возникает проблема, что функция scanf не работает. Скрин: Можно как-нить решить? И не будут ли.
Не определяется функция scanf
Привет!) У меня такая проблема. не хочет считывать строки(( уже все перепробовал. вот.
Функция scanf(), не считывает данные
Вот перед вами кусок кода, это функция которая возвращает true или false bool ask(char *text)
Решение
Решение
Но при этом делаете вывод, что scanf не работает?
У всех работает, а у Вас не работает.
Очевидно же, что дело не в scanf.
Найдите ошибку в коде:
Функция ввода с клавиатуры scanf
Здравствуйте. WinXP, MS VS20005 В приведенном коде BBB независимо от введенного с клавиатуры.
Чтение вещественного числа, функция scanf
Здравствуйте! Только начал знакомство с этим замечательным языком. Возникла такая проблема.
Функция scanf + проверка на ввод данных
Как я понимаю: использовать scanf + массив для проверки на корректность ввода — неудачная идея. Она.
Почему не работает scanf в visual studio
MS VC2005, WinXP
В приведенном коде при вводе на первый запрос нечислового значения, например буквы, не выполняется последующий запрос scanf ввода значения BBB. В чем проблема?
Заранее благодарю за ответ!
unsigned short AAA, BBB;
int c;//промежут. переменная для ввода значений
void main()
setlocale(LC_CTYPE, "rus");
если не число ввести, то в c ничего не будет присвоено и останется предыдущее значение (скорее всего 0 в данном случае, ибо глобальная переменная).
(второе вроде не определено стандартом и может работать не везде)
MS VC2005, WinXP |
Он не портится, просто в нем остается та буква (если пытались прочитать число).
Считывает отформатированные данные из стандартного входного потока. Доступны более безопасные версии этих функций; см. раздел scanf_s ,, _scanf_s_l wscanf_s , _wscanf_s_l .
в Visual Studio 2015 printf функция и scanf семейство функций были объявлены как inline и перемещены в заголовки и. При переносе старого кода вы можете увидеть ошибку LNK2019 в подключении к этим функциям. Дополнительные сведения см. в статье Visual C++ журнал изменений 2003-2015.
Синтаксис
Параметры
format
Строка управления форматированием.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает количество успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Возвращаемое значение 0 указывает, что поля не были назначены.
Если format является NULL указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если выполнение может быть продолжено, эти функции возвращают EOF и устанавливают errno для значение EINVAL .
Дополнительные сведения об этих и других кодах ошибок см. в статьях _doserrno ,, errno _sys_errlist и _sys_nerr .
Remarks
scanf Функция считывает данные из стандартного входного потока stdin и записывает данные в расположение, заданное параметром argument . Каждый argument должен быть указателем на переменную типа, которая соответствует спецификатору типа в format . Если копирование производится между перекрывающимися строками, поведение не определено.
При чтении строки с параметром scanf всегда указывайте ширину %s формата (например, " %32s " вместо " %s "); в противном случае входные данные неправильного формата могут легко вызвать переполнение буфера. Кроме того, рекомендуется использовать scanf_s , _scanf_s_l wscanf_s _wscanf_s_l , или fgets .
wscanf — Это версия с расширенными символами scanf ; format аргумент для wscanf — строка расширенных символов. wscanf и scanf ведут себя одинаково, если поток открыт в режиме ANSI. scanf в настоящее время не поддерживает входные данные из потока Юникода.
Версии этих функций с _l суффиксом идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
Универсальное текстовое сопоставление функций
TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
---|---|---|---|
_tscanf | scanf | scanf | wscanf |
_tscanf_l | _scanf_l | _scanf_l | _wscanf_l |
Требования
Подпрограмма | Обязательный заголовок |
---|---|
scanf , * *_scanf_l ** | |
wscanf , _wscanf_l | либо |
консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью,, stdin stdout и stderr , должны быть перенаправлены до того, как функции времени выполнения C смогут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в статье Compatibility.
Как завтавить работать scanf() в VS2012
MSVS 2012 не хочет работать с базовой сишной функцией scanf(), нужно писать scanf_s(). Проект консольный, пустой. Как заставить её работать?
Вам нужно сделать вот что ( работает в Visual Studio 2012, думаю, сработает и в более ранних)
- Пункт меню View => Other Windows => Property Manager
- В появившемся окне кликаете правой кнопкой по проекту, выбираете пункт Properties
- Configuration Properties => C/C++ => Preprocessor => Preprocessor Definitions
- Кликаете Edit в выпадающем списке
- Добавляете в появившемся окошке строку _CRT_SECURE_NO_WARNINGS
- Сохраняете, закрываете. Должно работать
** Как найти Property Manager**
Вариант 2. На русской VS может не сработать В правом верхнем углу есть поле для поиска:
Куда тыкать дальше
Как использовать функцию scanf в visual studio?
Когда компилирую, visual studio показывает ошибку:
‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Когда компилирую через командную строку, все хорошо
Вы уверены что это ошибка, а не предупреждение (warning)? Я вот нет.
Как вы компилируете через командную строку? Возможно там или другой компилятор, или другое окружение, или другие настройки компиляции, или просто варнинги не показываются.
Использовать так как написано в вариннге — другую функцию scanf_s, или отключить варнинги секурности, или забить (но понимать чем это черевато).
Нет, не предупреждение, а ошибка
Компилирую в командной строке компилятором mingw
gcc main.c => a.exe
Попробовал scanf_s, компилируется, только уже с предупреждением, мол, что передано недостаточно аргументов для строки формата
Функция Scanf () и функция scanf_s () в Visual Studio 2019
описание проблемы
error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Анализ проблем и сравнение функций
функция scanf ()
Функция scanf () - это функция в ANSI C. Она не проверяет границу при чтении, поэтому может вызвать доступ к памяти вне допустимого диапазона. Например, выделяется 5 байтов пространства, но читается 10 байтов, как показано ниже:
Если вы введете 1234567890, 567890 будет записан в другое пространство, что приведет к аварийному запуску программы.
функция scanf_s ()
Чтобы предотвратить «scanf () не проверяет границу при чтении строки, что может вызвать утечку памяти» и привести к ненормальному запуску программы. Начиная с VS2005, Microsoft VS предоставляет функцию scanf_s (). Его функция такая же, как и у исходной функции scanf (), за исключением того, что когда вызывается функция scanf_s (),Необходимо указать число, чтобы указать максимальное количество символов для чтения во избежание переполнения.
Если в приведенном выше коде используется функция scanf_s (), вторая строка должна быть изменена на:
Это означает чтение не более 4 символов, потому что buf [4] должен помещать «\ 0». Последний параметр n функции scanf_s () - это размер буфера, что означает, что можно прочитать не более n-1 символов. При использовании функции scanf_s () для чтения одного символа также необходимо ограничить длину, которая записывается следующим образом.
подводить итоги
Функция scanf () - это исходная функция ввода, а функция scanf_s () - уникальная функция Microsoft VS. Оба имеют одинаковые функции, но последний более безопасен и надежен.
Повторное использование
При программировании на VS напишите в первой строке следующий оператор.
Если вы не хотите вводить оператор в первую строку, вы также можете настроить его в свойствах проекта VS, чтобы функция scanf могла нормально использоваться во всем проекте. Шаги настройки следующие:
- Найдите проект в строке меню → Свойства проекта → C / C ++ → препроцессор
- Справа есть определение препроцессора, добавьте к его параметрам _CRT_SECURE_NO_WARNINGS
3. Если два вышеупомянутых метода по-прежнему вызывают затруднения, существует третий метод. Найдите элемент в строке меню, найдите свойства проекта, найдите C / C ++, найдите генерацию кода, в генерации кода есть проверка безопасности, измените проверку безопасности, чтобы отключить проверку безопасности.
Последние две схемы применимы ко всему проекту, поскольку они изменяют параметры конфигурации проекта. Но этот параметр, естественно, не влияет на другие проекты, поэтому, если необходимо, ту же конфигурацию необходимо выполнить еще раз в других проектах, чтобы они вступили в силу.
Читайте также: