Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 10

С4996

22.10.2017, 15:37. Показов 1656. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
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
#include "stdafx.h" 
#include <iostream> 
#include <cstring> 
#include <stdio.h> 
#include <string.h> 
#include "windows.h" 
#include "locale.h" 
 
using namespace std;
 
 
char*strcpy1(char*dest, char*s, int p, int k)
{
    int lens = strlen(s);
    if (p >= lens) {
        *dest = 0;
        return dest;
    }
    int i = p;
    for (; s[i] && i<p + k; ++i)
        dest[i - p] = s[i];
    dest[i] = 0;
    return dest;
 
}
 
int main()
{
    char *s_source[] = { "01234", "01234", "01234", "01234", "01234", "01234", "" }, dest[100];
    int n = sizeof(s_source) / sizeof(char*);
    char **s = new char*[n];
    for (int i = 0; i<n; ++i) {
        s[i] = new char[15];
        strcpy(s[i], s_source[i]);
    }
    int p[] = { 1, 0, 3, 20, 3, 1, 0 };
    int k[] = { 2, 3, 2, 1, 20, 0, 1 };
    for (int i = 0; i < n; ++i) {
        printf("\nTest%i\n", i + 1);
        printf("my_strcpy1( \"%s\",\"%s\", %i, %i) =\"%s\"\n", dest, s[i], p[i], k[i], strcpy1(dest, s[i], p[i], k[i]));
    }
    for (int i = 0; i<n; ++i)
        delete[] s[i];
    delete[] s;
    system("pause");
    return 0;
}
Какую проверку надо добавить, чтобы С4996 не возникало?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2017, 15:37
Ответы с готовыми решениями:

Ошибка С4996
проблема необходимо копировать слова в массив **char Считывал строку с пробелами, далее переводил строку в нижний регистр, дабы иметь...

Ошибка С4996
Здравствуйте, компилятор ВС2015 выбаёт ошибку С4996 и жалуется на strcpy #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Ошибки С4996 и С42743
Подскажите, как устранить ошибки, вот код программы: #include &quot;GL/glew.h&quot; #include &quot;GL/glut.h&quot; #include &lt;iostream&gt; ...

23
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
22.10.2017, 15:54
EvilZone111, показать список ошибок для начала
C++
1
#pragma warning(disable:4996)
0
23.10.2017, 10:57

Не по теме:

Цитата Сообщение от EvilZone111 Посмотреть сообщение
using namespace std;
C++ detected :)

0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
23.10.2017, 13:33
Цитата Сообщение от EvilZone111 Посмотреть сообщение
С4996
Что за С4996? Какой-то код ошибки что ли? Так его расшифровывать надо, откуда ж нам знать чем вы компилируете.
Проверил на gcc:
$ g++ main.cpp -Wall
main.cpp:1:21: fatal error: stdafx.h: Нет такого файла или каталога
#include "stdafx.h"

Убираем мусор;
$ g++ main.cpp -Wall
main.cpp:6:22: fatal error: windows.h: Нет такого файла или каталога
#include "windows.h"

Убираем windows.h, оно тут не нужно, тем более что объявлено пользовательским а не системным файлом оО
$ g++ main.cpp -Wall
main.cpp: In function ‘int main()’:
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char *s_source[] = { "01234", "01234", "01234", "01234", "01234", "01234", "" }, dest[100];
^
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
main.cpp:29:83: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

Ругается на неявное приведение string->char*. Исправляем на явное приведение:
C++
1
char *s_source[] = { (char*)"01234", (char*)"01234", (char*)"01234", (char*)"01234", (char*)"01234", (char*)"01234", (char*)"" }
Проверяем
$ g++ main.cpp -Wall
$

То есть скомпилировалось без ошибок и предупреждений. Запускать это я, конечно же, не стал.
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 10
24.10.2017, 21:28  [ТС]
Все равно та же ошибка
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
24.10.2017, 22:00
убери
Цитата Сообщение от EvilZone111 Посмотреть сообщение
#include "stdafx.h"
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
24.10.2017, 22:14
EvilZone111, Вам же написал DobroAlex:
В самое начало вставьте
C++
1
#pragma warning(disable:4996)
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
24.10.2017, 22:34
Предупреждение компилятора (уровень 3) C4996
0
55 / 39 / 18
Регистрация: 21.05.2015
Сообщений: 184
24.10.2017, 22:59
Цитата Сообщение от Pilarentes Посмотреть сообщение
убери
Сообщение от EvilZone111
#include "stdafx.h"
Нельзя, он на Visual Studio делает. А вот ссылка kazak полезная
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
25.10.2017, 10:41
То есть это "предупреждение" всего лишь ругается на какие-то стандартные функции, чем-то не угодившие майкрософту?
Тогда должно помочь
C
1
#define _CRT_SECURE_NO_WARNINGS
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
25.10.2017, 10:57
Цитата Сообщение от Programist_NKPC Посмотреть сообщение
Нельзя, он на Visual Studio делает.
И что, что он на VS делает?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2017, 11:04
Цитата Сообщение от Nishen Посмотреть сообщение
И что, что он на VS делает?
http://g.zeos.in/?q=stdafx.h&m=1
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
25.10.2017, 11:48
hoggy, неясно, для чего Вы дали мне ссылки, и зачем ТС использует stdafx.h. И как использование VS обязывает использовать stdafx.h тоже неясно.

Достаточно этого
C++
1
2
3
#include <iostream> 
 
using namespace std;
И функцию strcpy заменить на strcpy_s.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
25.10.2017, 22:04
Цитата Сообщение от Nishen Посмотреть сообщение
И функцию strcpy заменить на strcpy_s
Зачем? Чтобы потерять совместимость с С/С++?
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
25.10.2017, 22:25
COKPOWEHEU, не знаю, зачем ТС не использует средства языка C++. Спросите у него.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.10.2017, 00:52
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем?
безопасность.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чтобы потерять совместимость с С/С++?
она не теряется
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
26.10.2017, 11:17
Цитата Сообщение от Nishen Посмотреть сообщение
не знаю, зачем ТС не использует средства языка C++. Спросите у него.
При чем здесь ТС? Я спрашиваю "зачем вы предлагаете использовать нестандартные функции вместо стандартных?", а не "зачем использовать функции Си вместо С++?".
Цитата Сообщение от hoggy Посмотреть сообщение
безопасность.
Можно подробнее? В чем именно нестандартные функции безопаснее стандартных?
Цитата Сообщение от hoggy Посмотреть сообщение
она не теряется
Да ну? Попробуйте это скомпилировать на чем-то отличном от msvs. Разумеется, без костылей вроде #define strcpy_s(a,b) strcpy(a,b) и подтягивания сторонней библиотеки.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.10.2017, 12:00
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Разумеется, без костылей вроде #define strcpy_s(a,b) strcpy(a,b)
это - не костыль.
это - UB.

нельзя дефайнить ключевые слова,
и стандартные имена.

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


пример 1
(избавляемся от С4996)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            for(auto i = segments.cbegin(), e = segments.cend() - 1; i!=e; ++i)
            {
                processed += i->len + 1;
 
                #ifdef _MSC_VER
                    auto checked 
                        = ::stdext::checked_array_iterator<ch*>(cur, len_path);   
                    std::copy_n(i->beg, i->len, checked);
                #else
                    std::copy_n(i->beg, i->len, cur);
                #endif      
                cur[i->len] = slash;
                cur +=i->len + 1;
            }
            const auto& last = segments.back();

важно:
если по каким либо соображениям нельзя переписать код по уму,
и было принято решение подавить ворнинг,
то данное подавление должно носить локальный характер

пример 2.
(избавляемся от множества ворнингов сторонней библиотеки,
возбуждаемых gcc/clang/mingw)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//================================================================================
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Weffc++"
    #pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
#endif
 
#include <gtest/gtest.h>
 
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic pop
#endif
//================================================================================
Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Можно подробнее? В чем именно нестандартные функции безопаснее стандартных?
почитайте офф. сайт майкрософт.
заодно почитайте дисскуссии комитета:
почему стандарт решил узаконить суффиксовые версии позикс-аналогов

так то можно было бы и не читать ничего.
итак ведь очевидно, что суффиксовые версии привентивно
понижают вероятность ошибок.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
26.10.2017, 12:49
Цитата Сообщение от hoggy Посмотреть сообщение
это - не костыль.
это - UB.
нельзя дефайнить ключевые слова,
Костыль почти всегда является UB, на то он и костыль.
А с каких пор strcpy_s стало ключевым словом? Это всего лишь название функции.
Цитата Сообщение от hoggy Посмотреть сообщение
всегда, нужно сначала пытаться по честному переписать код так,
что бы он не возбуждал ворнинга у компилятора.
...
если было принято решение подавить ворнинг, то данное подавление должно носить локальный характер
Всегда нужно писать код так чтобы он минимально зависел от конкретного компилятора. А там где это все-таки приходится нарушать, следует сделать отдельный слой абстракции.
Цитата Сообщение от hoggy Посмотреть сообщение
итак ведь очевидно, что суффиксовые версии привентивно
понижают вероятность ошибок.
Очевидно только что они ухудшают переносимость, причем без особой выгоды.
Так что, продемонстрируете strcpy_s на других компиляторах? Или, может, продемонстрируете преимущества этой функции перед стандартной?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.10.2017, 21:18
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Костыль почти всегда является UB, на то он и костыль.
не всегда.
точнее - почти никогда.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А с каких пор strcpy_s стало ключевым словом?
ни с каких.
вообще не очевидно,
как мог зародиться подобный вопрос.

Цитата Сообщение от hoggy Посмотреть сообщение
нельзя дефайнить ключевые слова,
и стандартные имена.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Очевидно только что они ухудшают переносимость, причем без особой выгоды.
очевидно, что они не просто так возникли,
и их не просто так завезли в стандарт.

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

вообще, знаете, как попадают вот такие вот функции в стандарт?
все упирается в бизнес.
всякие баги, сбои в программах проносят компаниям ощутимые убытки.
а руководству этих компаний глубоко фиолетовы ваши личные
вкусовые/религиозные предпочтения.

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

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так что, продемонстрируете strcpy_s на других компиляторах?
http://en.cppreference.com/w/c/string/byte/strcpy

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Или, может, продемонстрируете преимущества этой функции перед стандартной?
если так не понятно, по ссылке выше идет сравнение обеих версий,
с описанием профитов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2017, 21:18
Помогаю со студенческими работами здесь

Ошибка С4996
нашел следующий код: #include &lt;iostream&gt; #include &lt;sys/types.h&gt; #include &lt;winsock2.h&gt; #include &lt;memory.h&gt; #include...

"предупреждение С4996"- как от нее избавиться?
собственно, написал программу. Вроде все верно, но Visual Studio ругается на fwrite, fopen в программе и отказывается ее строить, буду ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru