Scanf не работает visual studio

Обновлено: 04.07.2024

Здравствуйте,
пишу простейшую программу на чистом си. Столкнулся с непреодолимыми трудностями присваивания переменной с клавиатуры с помощью scanf. Компилятор - Microsoft Visual Studio 2012,ОС - Windows 7 starter и Windows XP.

В частности, после присваивания переменной она остается неинициализированной. scanf возвращает значение 1 судя по отладчику. Причем, аналогичные строки выше отрабатывают нормально.

Вот текст программы:

//printf( "The time is %.19s.%hu %s\n", timeline, timebuffer.millitm, &timeline[20] ); printf( "\nThe time is %i.%i.%i %i:%i:%i\n", ts2.tm_mday, ts2.tm_mon+1, ts2.tm_yday + 1900, ts2.tm_hour, ts2.tm_min, ts2.tm_sec ); //printf( "\nThe time is %i.%i.%i %i:%i:%i\n", str_t.wDay, str_t.wMonth, str_t.wYear, str_t.wHour, str_t.wMinute, str_t.wSecond );

Проблема в строке printf("Input amount of seconds = "); scanf("%d", &c);
отладчик возвращает c = -3689348816733615091 после ее отрабоки.

После следующей строки ts2 = *localtime(&c); программа вылетает с исключением.

Самое удивительное, что если раскоментировать строки

//printf( "The time is %.19s.%hu %s\n", timeline, timebuffer.millitm, &timeline[20] );

то все ок работает (естественно надо убрать все, что относится к ts2), хотя вроде бы все идентично.

Я ввожу с клавиатуры число (scanf) 1444269069 - вроде в пределах изменения значений int

Хотелось бы узнать, почему такое поведение программы.




нет, исполняю в 32-битной среде на 32-битной системе Windows 7 Starter (32-битная) ет, исполняю в 32-битной среде на 32-битной системе Windows 7 Starter (32-битная)

Добавлено 09.10.15, 16:14
%ll попробуй


по-моему мнению, тогда и компилятор ничего не знает о 64-битности. если я не прав, то поясните.
и что надо делать, чтобы программа работал как надо?



time is a wrapper for _time64 and time_t is, by default, equivalent to __time64_t. If you need to force the compiler to interpret time_t as the old 32-bit time_t, you can define _USE_32BIT_TIME_T. This is not recommended because your application may fail after January 18, 2038; the use of this macro is not allowed on 64-bit platforms. тогда и компилятор ничего не знает о 64-битности. если я не прав, то поясните.
Разрядность ОС и компилятора явно никак не связана с разрядность доступных типов данных. Отличаться будет только реализация на уровне машинных инструкций. и что надо делать, чтобы программа работал как надо?
Попробуй использовать scanf_s
Можно будет указать размер переменной.
Как-то так:



VictorSh там нет никаких подводных камней - ниже простая эмуляция

Добавлено 10.10.15, 08:05
PS:

по-моему мнению, тогда и компилятор ничего не знает о 64-битности. если я не прав, то поясните. - у студии можно выставить разрядность платформы для которой хотим собрать проект, но дефолтом даже для х64 оси идёт х86 настройка.
Да, действительно.
Но такой подлости я не ожидал.
Контроль за размерами переменной сделан не для всех форматов и типов переменных.



  1. каков размер size_t на ideone?
  2. каков размер time_t на ideone?
  3. почему c кастуется к size_t перед выводом?



Qraizerпричём здесь IDEONE, перед тем как кинуть линк я собрал код в 6-ке и 10-ке на Win7 x64 в дебаге х86
И вне конкурса: почему не разобрался с причиной исключения в 6-ой студии?

Visual Studio unsafe error скриншот

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт "Проект" в верхнем меню

2. В открывшемся списке щёлкнем по "Свойства название_проекта"

Программа, вводящая два числа и выводящая их

Ошибка компиляции из-за небезопасности функций


3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

Свойства конфигурации

Определения препроцессора

OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Выпускник МГУ им. М.В. Ломоносова

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

Считывает отформатированные данные из стандартного входного потока. Доступны более безопасные версии этих функций; см. раздел scanf_s ,, _scanf_s_l wscanf_s , _wscanf_s_l .

в Visual Studio 2015 printf функция и scanf семейство функций были объявлены как inline и перемещены в <stdio.h> <conio.h> заголовки и. При переносе старого кода вы можете увидеть ошибку 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 ** <stdio.h>
wscanf , _wscanf_l <stdio.h> либо <wchar.h>

консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью,, stdin stdout и stderr , должны быть перенаправлены до того, как функции времени выполнения C смогут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в статье Compatibility.

в то время как мой инструктор может использовать scanf на vs, я не могу (должен использовать scanf_s).

может ли кто-нибудь сказать мне, почему? или какие еще могут быть различия?

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

*if я сканирую только int и символ (без последнего int), он работает нормально. (scanf_s("%d%c"))

  • цель состоит в том, чтобы ввести 2+2 и знать, что я могу сохранить каждый из них в различных проверяемых файлах.

почему доза моего vs act отличается от того, что мой инструктор vs? (тот же код)

спасибо вам, ребята, и хороших выходных!

1 ответ

У меня установлен Visual Studio 2010 professional. Если я установлю Visual Studio Express для телефона 7, будет ли Visual Studio 2010 все еще работать?

В чем разница между scanf и scanf_s ? В университете меня учили, и я использую scanf , но на моем персональном компьютере Visual Studio продолжает посылать это предупреждение. error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. И я должен изменить все.

Вы должны использовать _CRT_SECURE_NO_WARNINGS зайти в свойства проекта имя_проекта c/c++ препроцессор вы должны увидеть определение препроцессора добавьте его туда

Похожие вопросы:

Является ли поддержка scanf regex стандартом? Я нигде не могу найти ответа. Этот код работает в gcc, но не в Visual Studio: scanf(%[^\n],a); Это ошибка Visual Studio или расширение gcc ? EDIT.

У меня установлен Visual Studio 2010 professional. Если я установлю Visual Studio Express для телефона 7, будет ли Visual Studio 2010 все еще работать?

В чем разница между scanf и scanf_s ? В университете меня учили, и я использую scanf , но на моем персональном компьютере Visual Studio продолжает посылать это предупреждение. error C4996: 'scanf'.

Функция кодового объектива Visual Studio 2013 больше не будет работать. Он говорит Loading references for this method, но на это уходят годы, и на самом деле он вообще не загружает их ни для одного.

My visual studio 2015 не может создавать наборы инструментов платформы 2010. Там написано: Средства разработки для Visual Studio 2010 (твердотельного накопителя V100, если) не может быть найден.

Я получил ответ на свой вопрос. (LNK1104-это основной ответ, мой ответ - исправление ошибки установки). Недавно у меня была очень большая проблема с ошибкой LNK1104 с использованием c++, и я решил.

Я пытался удалить Xamarin и переустановить Visual Studio 2015, и это все время терпит неудачу. это ниже результаты в этом Есть ли где-нибудь место, где я могу забрать этот пропавший пакет напрямую.

Когда я использую visual studio, он говорит scanf is unsafe, try using scanf_s. Но если я использую scanf_s в gcc или других компиляторах, это не сработает. Работает ли scanf_s только на visual.

Читайте также: