Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
igorbelykh
8 / 8 / 3
Регистрация: 01.03.2013
Сообщений: 85
#1

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

11.03.2013, 23:57. Просмотров 1449. Ответов 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
Ответы с готовыми решениями:

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

Подскажите почему не работает
Нужно добавить К элементов в конец динамического массива ...

Р. Лафоре Подскажите, почему не работает
Никак не пойму, в чем ошибка. #include <iostream> using namespace std; ...

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

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

10
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 09:10 #2
strcpy_s() - не стандарт. Используйте эту функцию:
C++
1
strncpy(pUAgent, pcStr, strlen(pcStr));
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:09 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
Где тут что потеряно?
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 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
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.03.2013, 12:36 #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Приемный буфер должен быть не меньше, чем исходная строка.
Я о значении параметра, дословный перевод. Понятно, что если фактически буфер будет больше - ошибок это не увеличит. Кроме лишнего расхода памяти.
0
alsav22
5439 / 4834 / 831
Регистрация: 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
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.03.2013, 12:48 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Где тут что потеряно?
при вызове strncpy() не копируется последний \0-символ.
Чтобы это проверить добавьте м/у 2 и 3 строкой такую:
C++
1
memset( pUAgent, '?', strlen(pcStr)+1 );
Ну и посмотрите на вывод после strncpy(). Увидите лишний '?'.
1
alsav22
5439 / 4834 / 831
Регистрация: 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 / 3
Регистрация: 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

ПОдскажите почему не работает rand?
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using namespace std;...

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

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


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

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

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