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

Использование функции strcat_s. Ошибка при выполнении

19.04.2017, 06:37. Показов 3251. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Начал изучать С++. Пока осваиваю самые азы. В качестве учебника взял книгу А.Хортона "Visual C++ 2010. Полный курс". Среду разработки также решил использовать Visual Studio 2010.
Дошёл до раздела "Объединение строк, ограниченных нулевым символом".
Пытаюсь воспроизвести пример, приведенный здесь, но он выполняется с ошибкой.
Вот код:

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
#include<iostream>
#include<Windows.h>
 
#include<cerrno>
#include<cstring>
 
using std::cout;
using std::endl;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const size_t count = 30;
    char str1 [ count ] = "Many hands";
    char* str2 = (" make light work.");
 
    errno_t error = strcat_s (str1, count, str2);
    
    if(error == 0)
    {
        cout << "Строки успешно объединены." << endl;
        cout << str1 << endl;
    }
    else if(error == EINVAL)
        cout << "Ошибка! Исходная или целевая строка равна NULL." << endl;
 
    else if(error == ERANGE)
        cout << "Ошибка! Целевая строка слишком мала." << endl;
 
    return 0;
}
Если его запустить как есть, то ошибки не происходит. Т.е. первый обработчик ошибки if(error == 0) отрабатывается, строки объединяются и выводятся на экран.

Если же намеренно сделать чтобы происходила ошибка, например уменьшить размер массива для хранения символьных строк или сделать одну из строк нулевой, то обработчик ошибок не отрабатывает следующие проверки else if(error == EINVAL) и else if(error == ERANGE), и программа соответственно выдаёт ошибки при исполнении.

В чём ошибка, что не правильно делаю?

Заранее благодарю
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2017, 06:37
Ответы с готовыми решениями:

Ошибка при выполнении функции (std::bad_alloc at memory location)
При выполнении функции выскакивает ошибка: Unhandled exception at 0x77b815de in SII_V1_Lab2.exe: Microsoft C++ exception: std::bad_alloc...

Использование памяти при выполнении программы
Здравствуйте, товарищи. Столкнулись с такой загвоздкой. Есть некая, совершенно небольшая программа, после компиляции которой и запуски...

Ошибка памяти при выполнении, при компиляции не выводит ошибки
ПОмогите плс программа вводит строку символов до точки, а после вычисляет процент согласных в этой строке и выводит их в обратном порядке....

8
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.04.2017, 09:09
Цитата Сообщение от Artem1977 Посмотреть сообщение
Если же намеренно сделать чтобы происходила ошибка
Где код?
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
19.04.2017, 09:17  [ТС]
Т.е. что значит где? После слов Вот код:
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.04.2017, 09:18
Artem1977, код, содержащий намеренно сделанные ошибки.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
19.04.2017, 09: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
#include<iostream>
#include<Windows.h>
 
#include<cerrno>
#include<cstring>
 
using std::cout;
using std::endl;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const size_t count = 30;
    char str1 [ count ] = "Many hands";
    char* str2 = (" make light work. Много рук облегчают работу");
 
    errno_t error = strcat_s (str1, count, str2);
    
    if(error == 0)
    {
        cout << "Строки успешно объединены." << endl;
        cout << str1 << endl;
    }
    else if(error == EINVAL)
        cout << "Ошибка! Исходная или целевая строка равна NULL." << endl;
 
    else if(error == ERANGE)
        cout << "Ошибка! Целевая строка слишком мала." << endl;
 
    return 0;
}

, в результате при объединении должна быть обработка ошибки else if(error == ERANGE)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.04.2017, 09:58
Вот что об этом пишут в MSDN:
if the destination string is too small, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return EINVAL and set errno to EINVAL.
То есть, если строка слишком мала, вызывается invalid parameter handler. Вот что про него пишут:
By default, the invalid parameter calls _invoke_watson which causes the application to "crash,"
То есть, по-умолчанию программа и должна крашиться в таких случаях. Так и задумано.

При желании это поведение можно переопределить, как это сделать написано в MSDN. Но лучше на это не полагаться и проверять длину строки самостоятельно. Более того, функция strcat_s не является стандартной, поэтому многие вообще не рекомендуют её использовать.

Добавлено через 5 минут
Вообще, для изучения языка надо брать учебник именно по языку, а не по Visual C++.
Например, что-то из этого.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
19.04.2017, 10:00  [ТС]
Ну так в коде вроде как помещён обработчик ошибки для этих случаев. Я вот и хочу понять, почему он не вступает в действие
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.04.2017, 10:19
Цитата Сообщение от Artem1977 Посмотреть сообщение
Ну так в коде вроде как помещён обработчик ошибки для этих случаев.
Только до него дело не доходит, вместо этого программа крашится, как и должно быть по-умолчанию. Если хочется, чтобы этого не было, нужно задать свой обработчик ошибок. Как это сделать написано здесь.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
19.04.2017, 12:58  [ТС]
Понятно. Мне как новичку до этого пока далеко
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2017, 12:58
Помогаю со студенческими работами здесь

При выполнении разных операций с MS VS2013, например, при закрытии, иногда появляется ошибка
В кодерстве совсем-совсем новичёк, поэтому извиняйте за нубость вопроса. Пытаюсь разобраться в программе MS Visual Studio 2013 (ставил под...

Ошибка при выполнении
Когда запускаю программу на выполнение, выдает ошибку: Linker Error: Undefined symbol input(char near*,int near*, int) in module ...

Ошибка при выполнении
Привет всем. Скажите пожалуйста, что мне делать? При выполнении программы выдает ошибку &quot;Инструкция по адресу &quot;0x004013bd&quot;...

Ошибка при выполнении программы.
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; #include &lt;cstdlib&gt; using namespace std; int main () { int n, m, k; ...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru