Перейти к содержимому

Возвращаемое значение пропущено scanf как исправить

  • автор:

Функция scanf

Для считывания данных в языке C используется функция scanf. Ее использование похоже на функцию prinf — сначала задается форматная строка, потом передаются переменные, в которые необходимо записать результат. Например, для считывания двух целых чисел функция вызывается так:

Основное отличие функции scanf в том, что при считывании чисел (или значений типа char) ей необходимо передавать адреса переменных (в языке C все параметры передаются по значению, поэтому чтобы функция scanf могла модифицировать переменную, необходимо передать в функцию адрес этой переменной). Поэтому перед названиями переменных мы пишем знак амперсанда («&»).

В функции scanf могут быть явно записаны какие-то символы, кроме форматных строк. Например, вызов

можно использовать для считывания времени, заданного в виде hh:mm — функция считает число, затем символ двоеточия, затем опять число.

Если в форматной строке встречается пробел, то он означает, что будет считано любое число пробельных символов, возможно даже нулевое.

Особенности считывания чисел

Функция scanf корректно считывает целые числа, если они начинаются с символа 0, или со знака «+». То есть числа «+123» или «0123» будут корректно считаны по форматной строке «%d», никаких дополнительных параметров задавать не нужно.

Также при считывании чисел игнорируются пробелы перед числом. Это означает, что вызов

scanf(«%d:%d», &a, &b) сможет корректно считать время, заданное в формате hh:mm при наличии пробела после двоеточия (такая запись успешно считает строки «12:34», «01:02», «01:␣23» или «␣01:␣23», поскольку дается указание считать число, затем сразу же двоеточие, затем — число, перед которым могут быть пробелы). Но такая запись не считает выражение, например, вида «01␣:␣23», поскольку после первого числа сразу должно идти двоеточие.

Чтобы считать записать вида «01␣:␣23» можно использовать форматную строку «%d :%d», причем пробел в форматной строке может означать и отсутствие пробелов.

Возможные форматные символы

Возможные форматные символы функции scanf для разных типов данных в целом соответствуют форматным символам для функции printf , но имеют меньше различных модификаторов.

Форматная
строка
Соответствующий ей тип
%hhd Считать число (десятичное) и записать его в переменную типа char (для unsigned char нужно использовать %hhu)
%hd short int (для unsigned short int нужно использовать %hu)
%d int (для unsigned int нужно использовать %u)
%ld long int (для unsigned long int нужно использовать %lu)
%lld long long int (для unsigned long long int нужно использовать %llu)
%f float
%lf double
%Lf long double
char. Считывается один символ, он может быть пробелом или символом конца строки.
%s Считывается последовательность непробельных символов (строка), записывается в C-строку (типа char * или char[])

Особенность считывание символов

Считывание одного символа «%c» считывает из потока ввода следующий символ, он может быть в том числе и пробельным символом, а также символом конца строки. Но если в форматной строке перед «%c» поставить пробел, то поскольку пробел в форматной строке обозначает последовательность пробельных символов любой длины, то в этом случае будет считан следующий непробельный символ.

Особенность считывания строк

При считывании строки результат записывается в С-строку, которая представляет собой массив символов (или указатель типа char * с выделенной памятью). Поскольку строка в языке C является адресом (указателем) в памяти, где хранится начало строки символов, то передавать в функцию scanf нужно имя переменной без указания амперсанда.

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

Иногда бывает полезно считать всю строку целиком вместе с пробелами до конца строки. Для этого используется функция gets . Например:

Функция gets считается опасной и не рекомендуется для использования, так как она не контролирует количество считанных символов и не учитывает длину передаваемой строки, что может привести к записи данных за пределами строки.

Вместо нее рекомендуется использование функции fgets , у которой три параметра — строка для записи результата, размер строки и файловый поток, из которого читаются данные. Например:

fgets(s, 101, stdin);

В данном случае мы использовали stdin для чтения со стандартного ввода.

Не следует забывать, что в языке C в конец строки добавляется нулевой символ для обозначения конца строки. То есть если необходимо считать строку, в которой может быть 4 символа, то для нее нужно создать массив char[5] , и функции fgets нужно передавать число, не меньшее 5.

Возвращаемое значение

Функция scanf возвращает значение, равное числу успешно считанных и записанных в переданные параметры значений, что можно использовать для анализа входных данных.

Например, пусть вызвали scanf(«%d:%d», &a, &b) .

Тогда при вводе строки «12:34» функция scanf считает два числа, запишет их в переменные a и b и вернет значение 2. А при вводе «12 34» будет считано только одно число, поскольку после него должно идти двоеточие, то второе число считано не будет и функция scanf вернет значение 1.

Возвращаемое значение пропущено scanf как исправить

Сообщений: 6

Метод Гаусса C++

Написал код, выдает ошибку и предупреждения.
Ошибка C4700 «использована неинициализированная локальная переменная «j»»
Предупреждение C6031 «Возвращаемое значение пропущено: «scanf»»
Предупреждение C4552 «»

#define _CRT_SECURE_NO_WARNINGS #include #include //описание функций ввода-вывода #include //описание математических функций #include //описание функции malloc и free #include using namespace std; int gaussMethod( int m, int n, double *a, double eps ); int main() < int m, n, i, rank; int j; double* a; double eps, det; printf("Введите размер матрицы m,n: "); scanf("%d%d", &m, &n); a = new double[m * n]; printf("Введите элементы матрицы: "); for (i = 0; i < m; ++i) < for (j < 0; j < n; ++j) < scanf("%lf", &(a[i * n + j])); >> printf("Введите точность вычислений eps: "); scanf("%lf", &eps); rank = gaussMethod(m, n, a, eps);//Вызываем метод Гаусса printf("Ступенчатый вид матрицы: \n"); for (i = 0; i < m; ++i) < for (j = 0; j < n; ++j) < printf("%10.3lf", a[i * n + j]); >printf("\n"); > printf("Ранг матрицы: %d\n", rank); if (m == n) < det = 1.0; for (i = 0; i < m; ++i) < det *= a[i * n + i]; >printf("Определитель матрицы = %3lf\n", det); > delete[]a; return 0; int gaussMethod( int m, int n, double* a, double eps); < int i,j,k,l; double r; i = 0; j = 0; while (i < m && j < n) < r = 0.0; for (k = i; k < m; ++k) < if (fabs(a[k * n + j]) >r) < l = k; r = fabs(a[k * n + j]); >if (r ++j; continue; > if (l != i) < for (k = j; k < n; ++k) < r = a[i * n + k]; a[i * n + k] = a[l * n + k]; a[l * n + k] = (-r);//меняем знак строки >> r = a[i * n + j]; assert(fabs(r) > eps); for (k = i + 1; k < m; ++k) < double c = (-a[k * n + j]) / r; a[k * n + j] = 0.0; for (l = j + 1; l < n; ++l) < a[k * n + l] += c * a[i * n + l]; >++i; ++j; > return i; > > > >

Последний раз редактировалось Ars_Kis; 15.04.2023 в 17:33 . Причина: Добавление

Предупреждение C6031

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

Как правило, небезопасно предположить, что вызовы функций, требующих дисков, сети, памяти или других ресурсов, будут успешными. Вызывающий объект всегда должен проверка возвращаемое значение и обрабатывать случаи ошибок соответствующим образом. Также рекомендуется использовать заметку _Must_inspect_result_ , которая проверка, что значение проверяется полезным способом.

Имя анализа кода: RETVAL_IGNORED_FUNC_COULD_FAIL

Пример

Следующий код создает предупреждение C6031:

#include void f( ) < fopen( "test.c", "r" ); // C4996, C6031 return value ignored // code . >

Чтобы исправить это предупреждение, проверка возвращаемое значение функции, как показано в следующем коде:

#include void f( ) < FILE *stream; if ( (stream = fopen( "test.c", "r" )) == NULL ) return; // code . >

Следующий код использует безопасную функцию fopen_s для исправления этого предупреждения:

#include void f( ) < FILE *stream; errno_t err; if ( (err = fopen_s( &stream, "test.c", "r" )) !=0 ) < // code . >> 

Это предупреждение также создается, если вызывающий объект игнорирует возвращаемое значение функции, аннотированной свойством _Check_return_ , как показано в следующем коде.

#include _Check_return_ bool func(); void test_f() < func(); // Warning C6031 >

Чтобы исправить предыдущее предупреждение, проверка возвращаемое значение, как показано в следующем коде:

#include _Check_return_ bool func(); void test_f() < if ( func() ) < // code . >> 

В случаях, когда необходимо игнорировать возвращаемое значение функции, назначьте возвращаемое значение std::ignore . Назначение std::ignore явно указывает намерение разработчика и помогает в будущем обслуживании кода.

#include #include #include void f() < std::srand(static_cast(std::time(nullptr))); // set initial seed value to system clock std::ignore = std::rand(); // Discard the first result as the few random results are always small. // . >

Возвращаемое значение пропущено: «scanf» Код : C6031 Visual Studio 2022

При объявлении scanf, строки кода подчёркиваются желтой волнистой линией. Как ни старался решить эту проблему, ничего не выходит.

#include int main() < float x, y, res; scanf("%f", &x); scanf("%f", &y); res = x / y; printf("Result: %.2f\n", res); return 0; >

Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
задан 22 июн 2022 в 15:02
Courier Six Courier Six
1 3 3 бронзовых знака
А вы в курсе, что scanf возвращает значение? Которое стоит и проверить.
22 июн 2022 в 15:10
Не совсем понял Вас
22 июн 2022 в 15:12
22 июн 2022 в 16:39

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Попробуйте переписать так:

#include int main() < float x, y, res; if (scanf("%f", &x) != 1) return 1; if (scanf("%f", &y) != 1) return 1; res = x / y; printf("Result: %.2f\n", res); return 0; >

Отслеживать
ответ дан 22 июн 2022 в 18:47
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков

  • c
  • visual-studio
  • функции
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *