Почему не работает scanf в visual studio
Здравствуйте, valytch, Вы писали:
V>Имеется код вида:
Если интересует в чем проблема, то это не ко мне, я так и не понял, хотя есть предположение, что все портит [^.]. Но я нашел как решить
V>
V> char* strBuff = new char[255]; V> printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); V> do V> < V>if(!scanf("%[^.]s", strBuff)) assert(0); fflush(stdin); // а вот это "доктор" :) V> // [skip] V> > V> while(strcmp("..", strBuff) != 0); delete [] strBuff; // надо не забывать! V>> V>
Re: Почему не работает scanf() ?
| От: | Аноним | |
| Дата: | 26.01.04 11:12 | |
| Оценка: | 2 (1) | |
Здравствуйте, valytch, Вы писали:
V>Имеется код вида:
V>
V>#include V>#include V>#include V>#include V>#include V>using namespace std; V>void main() V> < V>char* strBuff = new char[255]; V> printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); V> do V> < V>if(!scanf("%[^.]s", strBuff)) assert(0); V> // [skip] V> > V> while(strcmp("..", strBuff) != 0); V>> V>
V>Проблема: первый вызов scanf() проходит замечательно, строка помещается в буфер,
V> а все последующие вызовы возвращают ошибку (0). При этом scanf() даже
V> не пытается что-либо считать (курсор в консоли исчезает и никакой реакции
V> на нажатие клавиш). В чём дело?
V>В настройках компилятора: «Character set»=»Use Multi-Byte Character Set».
V>Использовалась MS VS.NET
не работает потому, что это глюк в реализации scanf().
прикол в том, что это не работает и в Linux’ах, там и fflash() не помогает. проверял в свое время. видимо они все сдирают друг у друга.
с тех пор я пишу
gets(. )
sscanf(. )
эти ф-ции работают нормально
Почему не работает scanf() ?
| От: | valytch |
| Дата: | 24.01.04 23:58 |
| Оценка: |
Имеется код вида:
#include #include #include #include #include using namespace std; void main() < char* strBuff = new char[255]; printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); do < if(!scanf("%[^.]s", strBuff)) assert(0); // [skip] > while(strcmp("..", strBuff) != 0); >
Проблема: первый вызов scanf() проходит замечательно, строка помещается в буфер,
а все последующие вызовы возвращают ошибку (0). При этом scanf() даже
не пытается что-либо считать (курсор в консоли исчезает и никакой реакции
на нажатие клавиш). В чём дело?
В настройках компилятора: «Character set»=»Use Multi-Byte Character Set».
Использовалась MS VS.NET
Re: Почему не работает scanf() ?
| От: | Аноним |
| Дата: | 25.01.04 07:57 |
| Оценка: |
Здравствуйте, valytch, Вы писали:
V>Имеется код вида:
V>
V>#include V>#include V>#include // А лучше cstdio V>#include // А лучше cstring V>#include // А лучше cassert V>using namespace std; V>void main() V> < V>char* strBuff = new char[255]; V> printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); V> do V> < V>if(!scanf("%[^.]s", strBuff)) assert(0); V> // [skip] // Мне кажется, проблема здесь? V> > V> while(strcmp("..", strBuff) != 0); V>> V>
V>Проблема: первый вызов scanf() проходит замечательно, строка помещается в буфер,
V> а все последующие вызовы возвращают ошибку (0). При этом scanf() даже
V> не пытается что-либо считать (курсор в консоли исчезает и никакой реакции
V> на нажатие клавиш). В чём дело?
V>В настройках компилятора: «Character set»=»Use Multi-Byte Character Set».
V>Использовалась MS VS.NET
Re[2]: Почему не работает scanf() ?
| От: | valytch |
| Дата: | 25.01.04 14:50 |
| Оценка: |
V>>// [skip] V>> char* strBuff = new char[255]; V>> printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); V>> do V>> < V>> if(!scanf("%[^.]s", strBuff)) assert(0); V>> > V>> while(strcmp("..", strBuff) != 0); V>>// [skip] V>>
Даже в таком виде не работает. На второй и последующих
итерациях цикла — выполняется assert. Дело именно в scanf().
Но! При первом вызове — работает нармально.
Re[2]: Почему не работает scanf() ?
| От: | valytch |
| Дата: | 25.01.04 21:40 |
| Оценка: |
Здравствуйте, leshi, Вы писали:
L>Если интересует в чем проблема, то это не ко мне, я так и не понял, хотя есть предположение,
что все портит [^.]. Но я нашел как решить
V>>
V>> char* strBuff = new char[255]; V>> printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); V>> do V>> < V>> if(!scanf("%[^.]s", strBuff)) assert(0); L> fflush(stdin); // а вот это "доктор" :) V>> // [skip] V>> > V>> while(strcmp("..", strBuff) != 0); L> delete [] strBuff; // надо не забывать! V>>> V>>
Да, для этого случая решает. Но! Когда всё работает — становится неинтересно,
и я пошёл дальше.
Дело в том, что scanf() не проверяет количество введённых символов, а мне понадобилось,
что бы строка была не более 80-ти символов. Покопавшись в , вышеприведённый кусок был
приведён к виду:
char* strBuff = new char[255]; printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); do < cin.getline(strBuff, MAXSTRLEN+1, '.'); fflush(stdin); memset(strBuff, 0x00, sizeof(strBuff)); > while(strcmp("..", strBuff) != 0);
Оказалось, что проблема та-же, но fflush(stdin) уже не помогает. А помогает следующая конструкция:
char* strBuff = new char[81]; printf("Input some strings (\".\" - end of string, \"..\" - done): \n"); do < (cin.getline(strBuff, 81, '.')).clear(ios::goodbit); cin.ignore(255, '.'); memset(strBuff, 0x00, sizeof(strBuff)); > while(strcmp("..", strBuff) != 0); // Про delete[] strBuff; помним, но не приводим для экономии места. ;)
Но такая конструкция выглядит некрасиво как с точки зрения эстетики, так
и чисто с практической точки зрения.
Мот всё же кто-то знает природу сего явления?
scanf , _scanf_l , wscanf , _wscanf_l
В Visual Studio 2015 printf были объявлены inline и scanf перемещены в заголовки и семейства функций. Если вы переносите старый код, в связи с этими функциями может появиться LNK2019 ошибка компоновщика. Дополнительные сведения см. в журнале изменений Visual C++ 2003 – 2015.
Синтаксис
int scanf( const char *format [, argument]. ); int _scanf_l( const char *format, _locale_t locale [, argument]. ); int wscanf( const wchar_t *format [, argument]. ); int _wscanf_l( const wchar_t *format, _locale_t locale [, argument]. );
Параметры
format
Строка управления форматированием.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает число полей, успешно преобразованных и назначенных; Возвращаемое значение не включает поля, которые были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не были назначены.
Если format это NULL указатель, вызывается обработчик недопустимых параметров, как описано в разделе «Проверка параметров». Если продолжение выполнения разрешено, эти функции возвращают EOF и устанавливают для errno значение EINVAL .
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno , _doserrno _sys_errlist и _sys_nerr .
Замечания
Функция scanf считывает данные из стандартного входного потока stdin и записывает данные в расположение, указанное параметром argument . Каждый параметр argument должен быть указателем на переменную, которая имеет тип, соответствующий спецификатору типа в параметре format . Если копирование производится между перекрывающимися строками, поведение не определено.
При использовании scanf для чтения строки всегда следует указывать ширину для формата %s (например, %32s вместо %s ); в противном случае ввод в неправильном формате может легко привести к переполнению буфера. Кроме того, рекомендуется использовать scanf_s , wscanf_s _scanf_s_l _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. Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_scanf.c // compile with: /W3 // This program uses the scanf and wscanf functions // to read formatted input. #include int main( void ) < int i, result; float fp; char c, s[81]; wchar_t wc, ws[81]; result = scanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, ws ); // C4996 // Note: scanf and wscanf are deprecated; consider using scanf_s and wscanf_s printf( "The number of fields input is %d\n", result ); printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws); result = wscanf( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s, ws ); // C4996 wprintf( L"The number of fields input is %d\n", result ); wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws); >
71 98.6 h z Byte characters 36 92.3 y n Wide characters
The number of fields input is 6 The contents are: 71 98.599998 h z Byte characters The number of fields input is 6 The contents are: 36 92.300003 y n Wide characters
Почему функция «scanf» не работает в си?
/*Программа требует от пользователя ввод данных, но эти данные не воспринимаются scanf, выставляются либо минимальные значения, либо нули, уже кучу форумов перерыл в поисках ответа, но так и не нашел его, что делать? */ // Геометрическая лаба.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include"math.h" #include"stdio.h" #include"Windows.h" #include"stdlib.h" #include"cstdlib" #include"conio.h" #pragma warning (disable : 4996) int main() < SetConsoleCP(1251); SetConsoleOutputCP(1251); float xa, ya, xb, yb, xc, yc, xd, yd, S, AB, BC, CD, DA, AC, BD; printf("Введите координаты точек вашей фигуры(по часовой стрелке(A, B, C, D): "); scanf("%f, %f, %f, %f, %f, %f, %f, %f ", &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd); printf("%f, %f, %f, %f, %f, %f, %f, %f ", &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd); AB = sqrt(pow((xb - xa), 2) + pow((yb - ya), 2)); BC = sqrt(pow((xc - xb), 2) + pow((yc - yb), 2)); CD = sqrt(pow((xd - xc), 2) + pow((yd - yc), 2)); DA = sqrt(pow((xa - xd), 2) + pow((ya - yd), 2)); AC = sqrt(pow((xc - xa), 2) + pow((yc - ya), 2)); BD = sqrt(pow((xd - xb), 2) + pow((yd - yb), 2)); if (DA + AB >BD && BC + CD > BD && AB == BC == CD == DA) < S = 1 / 2 * (AC + CD); printf("Площадб ромба S=, %d ", &S); >else < printf("Это не ромб, введите координаты заново\n"); system("pause"); return 0; >>
//(вот сама программа)
Отслеживать
задан 3 окт 2020 в 6:29
Drunk Withcher Drunk Withcher
21 1 1 серебряный знак 5 5 бронзовых знаков
Пробовали заменить scanf на scanf_s ?
3 окт 2020 в 6:34
printf(«%f, %f, %f, %f, %f, %f, %f, %f «, &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd); — Вы выводите адреса. ИМХО надо printf(«%f, %f, %f, %f, %f, %f, %f, %f «, xa, ya, xb, yb, xc, yc, xd, yd); Аналогично в printf(«Площадб ромба S=, %d «, &S); Вы выводите адрес переменной S/
3 окт 2020 в 6:35
scanf_ s пробовал, но не помогло, комментарий непонятен немного
3 окт 2020 в 6:42
@DrunkWithcher, в printf вы выводите адреса переменных, а не их значения
3 окт 2020 в 7:04
@DrunkWithcher Вы выводите не ответ, а номер ячейки памяти, где он лежит. Выведите содержимое ячейки, а не её номер (адрес). Подробнее описал в своём ответе.
3 окт 2020 в 7:33
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Оператор & перед именем переменной возвращает адрес в памяти, где хранится эта переменная. Функции scanf и другим подобным функциям нужен именно адрес переменной в памяти, поскольку им нужно записывать значение в эту переменную. Единственный способ изменять переменную внутри функции так, чтобы эти изменения были видны снаружи функции — передача в функцию указателя (как это делается в scanf ) или ссылки на переменную. Функциям вывода, таким как printf , не нужно изменять переменную внутри функции. Поэтому они работают с передачей переменной по значению. Оператор взятия адреса ( & ) перед аргументами printf не нужен. Если вы всё-таки используете оператор & перед аргументами printf , то Вы увидите на экране адреса (номера ячеек памяти), где лежат значения, а не сами значения. Что касается scanf_s и других подобных функций. Они делают то же самое, что и обычный scanf . Разница только в том, что они требуют указывать размер буфера, что позволяет предотвращать запись данных в память за границей массива. Что касается вычислений — не возьмусь проверять геометрические формулы. Выведите результат правильно (без & ). Если он по-прежнему будет неверным, советую просто выводить результаты каждого шага вычислений и сверять с вычисленными вручную данными. Так Вы легко найдёте ошибку. И расставьте скобки в условии if. Если Вам почему-то не хочется этого делать, почитайте по приоритет операторов и проверьте Ваше условие. Возможно, выражение в условии вычисляется совсем не так, как Вы ожидали.
Отслеживать
ответ дан 3 окт 2020 в 7:18
Yury Plinto Yury Plinto
787 1 1 золотой знак 4 4 серебряных знака 15 15 бронзовых знаков
Так, проблема решилась, во- первых ошибка была в scanf( после %f запятые не нужны), во вторых if надо было переделать вот так if ((DA + AB > BD) && (BC + CD > BD) && (AB == BC) && (BC == CD) && (CD == DA) && (DA == AB)) , в третьих амперсанд перед S не нужен, он лишний, спасибо за помощь вам всем)))) , кстати, чуть не забыл S = (1. / 2.) * (AC * BD); формулу площади лучше писать вот так.
Отслеживать
ответ дан 3 окт 2020 в 8:58
Drunk Withcher Drunk Withcher
21 1 1 серебряный знак 5 5 бронзовых знаков
- c
- ввод
- scanf
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Функция scanf() не работает
Здравствуйте, помогите решить проблему с функцией scanf(); Она не принимает значения в переменные вообще. Работаю в Visual Studio 2017. Пробовал по советам очищать поток и присваивать переменным значение int, не помогает.
Ошибка в данном месте
1 2 3 4 5
printf("\nВведите 3 кода игральных карт(6, 7, 8, 9, 10, В, Д, К, Т): "); fflush(stdin); scanf(" %с%с%с", &k1, &k2, &k3); printf("Ваши карты: %c, %c, %c", k1, k2, k3); getchar(); getchar();
Вот весь код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
// ConsoleApplication4.cpp: Defines the entry point for the console application. //1. Проверить истинность высказывания: "Цифры данного четырехзначного числа образуют убывающую последовательность". //2. Ввести две переменные целого типа с клавиатуры : A и B.Если их значения не равны, то присвоить каждой переменной произведение этих значений, а если равны, то присвоить переменным нулевые значения.Вывести значение разности квадратов этих переменных. //3. Вводится три кода игральной карты(6, 7, . В, Д, К, Т).Вывести набранную сумму этих карт. #include "stdafx.h" #include #include #include #define _CRT_SECURE_NO_WARNING int main() { setlocale(0, "Rus"); //--------------------------------------------------------Задание 1------------------------------------------------------------------------- int A = 0; int a = 0; int b = 0; int c = 0; int d = 0; printf("Задание 1"); printf("\nВысказывание: Цифры данного четырехзначного числа образуют убывающую последовательность.\nВведите четырехзначное число: "); scanf("%4d", &A); a = A / 1000; b = (A - a * 1000) / 100; c = (A - (a * 1000 + b * 100)) / 10; d = A - (a * 1000 + b * 100 + c * 10); if (a > b && b > c && c > d) { printf("\nИстинность: YES"); } else { printf("\nИстинность: NO"); } getchar(); getchar(); //--------------------------------------------------------Задание 2------------------------------------------------------------------------- int B = 0, C = 0; double f = 0; printf("\nЗадание 2"); printf("\nВведите 2 целочисленных числа через пробел: "); scanf("%d %d", &B, &C); if (B != C) { B = B; C = C; } else { B = 0; C = 0; } f = pow(B, 2) - pow(C, 2); printf("Значение разности квадратов: %.3lf", f); getchar(); getchar(); //--------------------------------------------------------Задание 3------------------------------------------------------------------------- char k1, k2, k3; printf("\nЗадание 3"); printf("\nВведите 3 кода игральных карт(6, 7, 8, 9, 10, В, Д, К, Т): "); fflush(stdin); scanf(" %с%с%с", &k1, &k2, &k3); printf("Ваши карты: %c, %c, %c", k1, k2, k3); getchar(); getchar(); return 0; }
