Форум программистов, компьютерный форум CyberForum.ru

Подскажите, почему не работает strcpy_s() - C++

Восстановить пароль Регистрация
 
igorbelykh
8 / 8 / 2
Регистрация: 01.03.2013
Сообщений: 85
11.03.2013, 23:57     Подскажите, почему не работает strcpy_s() #1
Вот код
C++
1
char *pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
C++
1
2
    pUAgent = new char[strlen(pcStr)+1];
    strcpy_s(pUAgent, strlen(pcStr), pcStr);
При компиляции ошибок не выдает. Но программы прекращает свое выполнение ошибкой именно на этой строке

C++
1
Программа "[4140] Test.exe" завершилась с кодом -1073740777 (0xc0000417).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 09:10     Подскажите, почему не работает strcpy_s() #2
strcpy_s() - не стандарт. Используйте эту функцию:
C++
1
strncpy(pUAgent, pcStr, strlen(pcStr));
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2013, 11:43     Подскажите, почему не работает strcpy_s() #3
Цитата Сообщение от alsav22 Посмотреть сообщение
strcpy_s() - не стандарт.
То, что это поделка от MS не значит, что она не должна работать как надо.
Судя по описанию второй аргумент должен быть равен размеру приемного буфера, а не размеру копируемой строки (Size of the destination string buffer). Я бы вообще вынес strlen(pcStr)+1 в отдельную переменную и использовал ее и в new, и при копировании.
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:09     Подскажите, почему не работает strcpy_s() #4
Цитата Сообщение от Tulosba Посмотреть сообщение
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
Где тут что потеряно?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2013, 12:19     Подскажите, почему не работает strcpy_s() #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Где тут что потеряно?
Сравните варианты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main() {
   
   char dest[100];
   char* src = "0123456789";
   
   strncpy ( dest, src, strlen(src) ); // Вариант 1
   //strncpy ( dest, src, strlen(src)+1 ); // Вариант 2
   
   cout << dest << endl;
   
   return 0;
}
вывод.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
12.03.2013, 12:25     Подскажите, почему не работает strcpy_s() #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Судя по описанию второй аргумент должен быть равен размеру приемного буфера
Приемный буфер должен быть не меньше, чем исходная строка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void foo(const wchar_t * expression,const wchar_t * function,const wchar_t * file,unsigned int line,uintptr_t pReserved){
    std::cout<<"Invalid parameter"<<std::endl;
}
 
int main(){
    _set_invalid_parameter_handler(foo);
    _CrtSetReportMode(_CRT_ASSERT, 0);
    char * pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22";
   char * pUAgent = new char[strlen(pcStr)+1];
   strcpy_s(pUAgent, strlen(pcStr)+1, pcStr);//И без +1 попробуйте
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2013, 12:36     Подскажите, почему не работает strcpy_s() #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Приемный буфер должен быть не меньше, чем исходная строка.
Я о значении параметра, дословный перевод. Понятно, что если фактически буфер будет больше - ошибок это не увеличит. Кроме лишнего расхода памяти.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:40     Подскажите, почему не работает strcpy_s() #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Сравните варианты:
Я про код ТС с моим исправлением:
C++
1
2
3
char *pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22";
char *pUAgent = new char[strlen(pcStr)+1];
strncpy(pUAgent, pcStr, strlen(pcStr));
Где тут что потеряно?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2013, 12:48     Подскажите, почему не работает strcpy_s() #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Где тут что потеряно?
при вызове strncpy() не копируется последний \0-символ.
Чтобы это проверить добавьте м/у 2 и 3 строкой такую:
C++
1
memset( pUAgent, '?', strlen(pcStr)+1 );
Ну и посмотрите на вывод после strncpy(). Увидите лишний '?'.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 13:11     Подскажите, почему не работает strcpy_s() #10
Тогда так:
C++
1
2
3
char *pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22";
char *pUAgent = new char[strlen(pcStr) + 1];
strncpy(pUAgent, pcStr, strlen(pcStr) + 1);
Или так:
C++
1
2
3
char *pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22";
char *pUAgent = new char[strlen(pcStr) + 1];
strcpy(pUAgent, pcStr);
Или так:
C++
1
2
3
4
char *pcStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22";
char *pUAgent = new char[strlen(pcStr) + 1];
strncpy(pUAgent, pcStr, strlen(pcStr));
pUAgent[strlen(pcStr)] = '\0';
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 13:50     Подскажите, почему не работает strcpy_s()
Еще ссылки по теме:

Не работает strcat_s с strcpy_s C++
C++ Подскажите, почему это работает!?)
Р. Лафоре Подскажите, почему не работает C++

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

Или воспользуйтесь поиском по форуму:
igorbelykh
8 / 8 / 2
Регистрация: 01.03.2013
Сообщений: 85
12.03.2013, 13:50  [ТС]     Подскажите, почему не работает strcpy_s() #11
Всем спасибо. Исправил следующим образом и все заработало
C++
1
2
pUAgent = new char[strlen(pcStr)+1];
    strcpy_s(pUAgent, strlen(pcStr)+1, pcStr);
Yandex
Объявления
12.03.2013, 13:50     Подскажите, почему не работает strcpy_s()
Ответ Создать тему
Опции темы

Текущее время: 09:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru