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

strcat_s - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.65
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
20.02.2013, 17:28     strcat_s #1
Здравствуйте! подскажите пожалуйста как правильно склеить 3 массива char

в функцию один массив передаю по указателю, а второй массив - непосредственно создаётся в функции
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void printKeys(char *title,int x, int y)
    {
        keys.remove('.');
        char* values = new char[keys.size()]; values[keys.size()] = '\0';
        for(int i = 0; !keys.empty();i++)
        {
            values[i] = keys.front();
            keys.pop_front();
        }
        strcat_s(title,strlen(title),values);// вот тут не получается сделать правильно
//а в TextOutA - надо вывести на печать только один массив (strcat title и values)
        //TextOutA(hdc,x,y,(LPCSTR)title,strlen(title));
        //TextOutA(hdc,strlen(title)*7,y,(LPCSTR)values,strlen(values));
    }

Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 17:28     strcat_s
Посмотрите здесь:

Не работает strcat_s с strcpy_s C++
C++ Работа со строками, функция strcat_s

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.02.2013, 17:44     strcat_s #2
Цитата Сообщение от PakistanCode Посмотреть сообщение
C++
1
char* values = new char[keys.size()]; values[keys.size()] = '\0';
может вызвать исключение замени на
C++
1
char* values = new char[keys.size()+1]; values[keys.size()] = '\0';
Добавлено через 4 минуты
Цитата Сообщение от PakistanCode Посмотреть сообщение
как правильно склеить 3 массива char
есть
C++
1
strcpy(char * dst, char *src);
только смотри что бы dst указывал в конец массива и чтобы dst не переполнился. Есть альтернатива
C++
1
memcpy(void *dst, const void* src, size_t len)
тут длину можно указать, и не забывай вышесказанное
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
21.02.2013, 01:05  [ТС]     strcat_s #3
aLarman, если честно так и не понял как мне делать.
Мне нужно тупо склеить 2 массива. 1 по указателю, а второй - созданный локально и вывести на печать.

на такую запись:
C++
1
strcat(title,values);
VS 2012 - ругается ;( И пишет мне что нужно использовать strcat_s
(функция - выше)

Добавлено через 1 минуту
aLarman, вот что кстати пишет про strcpy
Кликните здесь для просмотра всего текста
h:\tr\treewin32\treewin32.cpp(48): error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> d:\programms\vs 12\vc\include\string.h(110): см. объявление "strcpy"


Добавлено через 28 секунд
Я понимаю что это - warning, но всё равно хочется его избежать
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,341
21.02.2013, 01:12     strcat_s #4
Цитата Сообщение от PakistanCode Посмотреть сообщение
Я понимаю что это - warning, но всё равно хочется его избежать
Если хочешь избегать, то используй то, что предлагается: strcpy_s Она ничем не отличается от strcpy, кроме того, что передается еще и длина строки. А вообще, описание всех функций есть в MSDN
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
21.02.2013, 14:58  [ТС]     strcat_s #5
nonedark2008, я уже пробовал, проблема в том - что вылетает программа когда я пытаюсь склеить передаваемый массив в функцию
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    void printKeys(char *title,int x, int y)
    {
        char txt[100];
        keys.remove('.');
        char* values = new char[keys.size()]; values[keys.size()] = '\0';
        for(int i = 0; !keys.empty();i++)
        {
            values[i] = keys.front();
            keys.pop_front();
        }
        strcpy_s(txt,strlen(txt),values);
        strcpy_s(txt,strlen(txt),title);//здесь вылетает
        //TextOutA(hdc,x,y,(LPCSTR)title,strlen(title));
        //TextOutA(hdc,strlen(title)*7,y,(LPCSTR)values,strlen(values));
    }

И если можно, то хотелось бы обойтись без какого-либо доп. массива. а просто что то типа:
C++
1
strcpy_s(title,strlen(title),values);
Вот на всякий случай как вызываю:
C++
1
list.printKeys("Прямой обход:  ",0,40);
Добавлено через 13 часов 26 минут
=((
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,341
21.02.2013, 19:18     strcat_s #6
Цитата Сообщение от PakistanCode Посмотреть сообщение
strlen(txt)
Скорее всего будет считаться неверно. Эта функция считает кол-во символов, которые находятся до символа конца строки. А в массиве txt хрен знает что находится. В функции strcpy_s нужно указывать максимальное кол-во символов, которое может влезть в массив, чтобы случайно не написать мимо памяти.
Цитата Сообщение от PakistanCode Посмотреть сообщение
strcpy_s(title,strlen(title),values);
Никто не мешает, правда опять вместо strlen(title) нужно указывать максимальное кол-во символов, которое может поместиться в массив.

Цитата Сообщение от PakistanCode Посмотреть сообщение
list.printKeys("Прямой обход: ",0,40);
Но тогда такой вызов не сработатет, так как "Прямой обход: " имеет тип const char *
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
23.02.2013, 01:03  [ТС]     strcat_s #7
nonedark2008, ааааа. А есть какой-либо красивый способ обойти эту ситуацию?
И лучше как можно короче и не используя доп. память и всякие вспомогательные штуки?

Кстати спасибо за ваши разъяснения, помогают лучше понимать что происходит
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,341
23.02.2013, 01:11     strcat_s #8
PakistanCode, хмм я точно не понимаю, что вам требуется... Но посоветую, вместо массивов символов использовать спец. хранилища, а точнее std::string. Он удобнее, не нудно самому выделять память, не нужно ее освобождать, легко можно склеить две строки, заменить символы, преобразовать в массив char * и т.д.
Yandex
Объявления
23.02.2013, 01:11     strcat_s
Ответ Создать тему
Опции темы

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