Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
8 / 8 / 3
Регистрация: 01.03.2013
Сообщений: 85
1

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

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

Author24 — интернет-сервис помощи студентам
Вот код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2013, 23:57
Ответы с готовыми решениями:

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

Не работает удаление пробелов в строке! Подскажите пожалуйста, почему не работает?
Здравствуйте! Скажите пожалуйста, почему не работает данный код; должно брать строку, которую ввёл...

Подскажите почему не работает?
Подскажите пожалуйста почему не работает скрипт? <html> <head> <script...

Подскажите почему не работает
start: var nickname = prompt('Введите никнейм'); var str = 'Ваш никнейм: '; if...

10
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 09:10 2
strcpy_s() - не стандарт. Используйте эту функцию:
C++
1
strncpy(pUAgent, pcStr, strlen(pcStr));
0
:)
Эксперт С++
4773 / 3267 / 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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:09 4
Цитата Сообщение от Tulosba Посмотреть сообщение
С strncpy() не стоит забывать, что может быть не добавлен \0 в конец строки, если размер исходной строки больше буфера. Что собственно и происходит, т.к. потеряна +1.
Где тут что потеряно?
0
:)
Эксперт С++
4773 / 3267 / 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.03.2013, 12:36 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Приемный буфер должен быть не меньше, чем исходная строка.
Я о значении параметра, дословный перевод. Понятно, что если фактически буфер будет больше - ошибок это не увеличит. Кроме лишнего расхода памяти.
0
5498 / 4893 / 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
:)
Эксперт С++
4773 / 3267 / 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
5498 / 4893 / 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
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2013, 13:50
Помогаю со студенческими работами здесь

Подскажите почему не работает
Нужно добавить К элементов в конец динамического массива #include&lt;iostream.h&gt;...

Подскажите почему не работает
void __fastcall TForm3::Image1DblClick(TObject *Sender) { if(Panel5-&gt;Caption.Trim()==&quot;А&quot;) //...

Подскажите, почему не работает оператор if
У меня есть уравнение окружности: F := x^2+y^2 = 1. Для проверки if мне нужно отправить это...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru