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

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

  • автор:

Предупреждение 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 как исправить

Сообщений: 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 . Причина: Добавление

Как исправить ошибку «return value ignored:’scanf'» в коде C6031 в Visual Studio

Я совсем новичок в кодировании C (и кодировании в целом), поэтому я практиковался с некоторыми случайными программами. Это предполагается для определения стоимости транзитного билета (Translink Vancouver prices) на основе возраста пользователя и желаемого количества «зон» (сколько далеко они хотят пройти). Я успешно скомпилировал это, но по какой-то причине, которую я не могу понять, функции scanf игнорируются. Как мне это исправить? Пожалуйста, имейте в виду, что я только несколько дней кодировал. Спасибо!

int main(void) < int zones; int age; double price = 0.00; printf("Welcome to TransLink cost calculator!\n\n"); printf("Please enter the desired number of zones (1, 2, or 3) you wish to travel: "); scanf("%d", &zones); if (zones < 1) < printf("Invalid entry\n"); price = 0.00; >else if (zones > 3) < printf("Invalid entry\n"); price = 0.00; >else if (zones == 1) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0.00) < printf("Invalid Aage"); >else if (age < 5) < price = 1.95; >else if (age >= 5) < price = 3.00; >> else if (zones == 2) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0) < printf("Invalid Aage"); >else if (age < 5) < price = 2.95; >else if (age >= 5) < price = 4.25; >> else if (zones == 3) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0) < printf("Invalid Aage"); >else if (age < 5) < price = 3.95; >else if (age >= 5) < price = 4.75; >> printf("The price of your ticket is: $%.2f + tax\n", price); system("PAUSE"); return 0; > 

Поделиться Источник 19 сентября 2019 в 05:25

3 ответа

Немного лишнего здесь, чтобы добавить в комментарий.

Я использую версию Visual C, но она никогда не жалуется на возвращаемое значение из scanf , которое не используется. Что она делает, так это жалуется, что scanf небезопасен и устарел, когда его нет.

MS думает, что мне следует использовать собственную «более безопасную» версию scanf_s , которая еще хитрее в использовании и, по-видимому, не безопаснее вовсе — потому что это не похожая на замену, но принимает различные аргументы, поэтому легко ошибиться при использовании.

Одна из последующих проблем заключается в том, что компилятор выдает предупреждение для каждого использования scanf (и некоторых других функций), которое затуманяет другие предупреждения. Я справляюсь с этим, как советуют, добавляя #define перед первым включением заголовка библиотеки.

#define _CRT_SECURE_NO_WARNINGS #include

Есть другие вопросы, о которых MS предупреждает, и я фактически размещаю три #defines в начале каждого файла:

#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_DEPRECATE #define _CRT_NONSTDC_NO_DEPRECATE #include

Теперь соответствующие предупреждения легко видно.

Поделиться 19 сентября 2019 в 07:42

Возвращаемое значение
1-3) Количество аргументов получения, успешно присвоенных (которое может быть равным нулю в случае, если произошел сбой совпадения до присвоения первого аргумента получения), или ОШИБКА, если сбой ввода происходит до присвоения первого аргумента получения.

Вы игнорируете это возвращаемое значение.

scanf("%d", &age); 
int NofScannedArguments=0; /* Number of arguments which were successfully filled by the most recent call to scanf() */ /* . do above once, at the start of your function */ NofScannedArguments= scanf("%d", &age); /* check the return value to find out whether scanning was successful */ if(NofScannedArguments!=1) /* should be one number */ < exit(EXIT_FAILURE); /* failure, assumptions of program are not met */ >

. чтобы узнать, удалось ли сканирование. Не делать это — плохая идея и стоит предупреждения, которое вы получили.

Если вы хотите более изящно обрабатывать сбои, например, попросить пользователя снова,
используйте цикл и прочтите http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html о возможных подводных камнях, с которыми вы можете столкнуться.
Я не говорю, что вы НЕ должны использовать scanf, статья многое объясняет об использовании scanf, пытаясь убедить вас не использовать.

Поделиться 19 сентября 2019 в 06:05

Использование функций C++ для ввода SO намного проще. Вместо scanf и printf можно использовать cin и cout, как показано ниже:

#include // for cin and cout use int main() < int zones; std::cout > zones; std::cout

Ошибка scanf

Author24 — интернет-сервис помощи студентам

Решил вкатится в программирование на C.Сначала всё было нормально, скачал Microsoft Visual Studio, сделал несколько простых программок и все дела.После не длительного периода ещё раз зашёл в Microsoft Visual Studio, что-бы продолжить учиться и вспомнить некоторые вещи.Попробовал создать простую программу со scanf и узрел ошибку : «C6031 Возвращаемое значение пропущено: «scanf». Project1 C:\USERS\CHIPOKU\SOURCE\REPOS\PROJECT1\PROJECT1\SOURCE.C 5″
Попробовал в Sublime Text 3 и всё нормально скомпилировалось и запустилось

1 2 3 4 5 6 7 8
#include int main() { int a; scanf("%d", &a); printf("%d", a); return 0; }

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

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