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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
igorbelykh
8 / 8 / 2
Регистрация: 01.03.2013
Сообщений: 85
#1

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

11.03.2013, 23:57. Просмотров 1271. Ответов 10
Метки нет (Все метки)

Вот код
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).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите, почему не работает strcpy_s() (C++):

Не работает strcat_s с strcpy_s - C++
strcat_s(strcpy_s(s3, sizeof(s1), s1),sizeof(s2), s2); Так не работает. strcpy_s(s3, sizeof(s1), s1); strcat_s(s3, sizeof(s2), s2); А...

Подскажите почему не работает - C++
Нужно добавить К элементов в конец динамического массива #include<iostream.h> #include<stdlib.h> #include<conio.h> #include...

Подскажите, почему это работает!?) - C++
Мне необходимо изменить все строчные буквы на заглавные, это все получается. Я ввожу символы(причем заметьте массив чар из 0, но программа...

Подскажите плз, почему не работает - C++
Почему-то не работает цикл "for". При запуске кода в консольном окне переменная "h" проходит от "0" до "diametr". Но после окончания цикла...

ПОдскажите почему не работает rand? - C++
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; struct item { int data; // данные item *...

Р. Лафоре Подскажите, почему не работает - C++
Никак не пойму, в чем ошибка. #include <iostream> using namespace std; struct sterling { int pound; int shiling; int...

10
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 09:10 #2
strcpy_s() - не стандарт. Используйте эту функцию:
C++
1
strncpy(pUAgent, pcStr, strlen(pcStr));
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2013, 11:43 #3
Цитата Сообщение от alsav22 Посмотреть сообщение
strcpy_s() - не стандарт.
То, что это поделка от MS не значит, что она не должна работать как надо.
Судя по описанию второй аргумент должен быть равен размеру приемного буфера, а не размеру копируемой строки (Size of the destination string buffer). Я бы вообще вынес strlen(pcStr)+1 в отдельную переменную и использовал ее и в new, и при копировании.
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:09 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
Где тут что потеряно?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2013, 12:19 #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;
}
вывод.
0
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,865
Записей в блоге: 3
Завершенные тесты: 1
12.03.2013, 12:25 #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 попробуйте
}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2013, 12:36 #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Приемный буфер должен быть не меньше, чем исходная строка.
Я о значении параметра, дословный перевод. Понятно, что если фактически буфер будет больше - ошибок это не увеличит. Кроме лишнего расхода памяти.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:40 #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));
Где тут что потеряно?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2013, 12:48 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Где тут что потеряно?
при вызове strncpy() не копируется последний \0-символ.
Чтобы это проверить добавьте м/у 2 и 3 строкой такую:
C++
1
memset( pUAgent, '?', strlen(pcStr)+1 );
Ну и посмотрите на вывод после strncpy(). Увидите лишний '?'.
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 13:11 #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';
0
igorbelykh
8 / 8 / 2
Регистрация: 01.03.2013
Сообщений: 85
12.03.2013, 13:50  [ТС] #11
Всем спасибо. Исправил следующим образом и все заработало
C++
1
2
pUAgent = new char[strlen(pcStr)+1];
    strcpy_s(pUAgent, strlen(pcStr)+1, pcStr);
0
12.03.2013, 13:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 13:50
Привет! Вот еще темы с ответами:

Подскажите почему не работает вывод строк? - C++
подскажите почему программа работает некорректно? на выводе должно быть ,true] vec != vec2 vec == vec у меня же просто e vec...

Подскажите почему указатель работает неправильно? - C++
Вот код: #include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;cstdlib&gt; #include &lt;vector&gt; using namespace std; void...

подскажите почему программа работает неправильно - C++
Использование двумерного массива как аргумента функции и возвращаемого значения функции выдает предупреждение:1&gt;------ Build...

С++, оператор return. ПОдскажите, почему не работает? - C++
нужно, чтобы линейная программа завершалась, если выполняется условие. Но даже если условие не выполняется, совершается выход из...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru