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

функция strcpy и strcat - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 5.00
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
30.07.2009, 13:20     функция strcpy и strcat #1
Добрый день!У меня такая проблема...Есть массив строк, где хранятся имена и при выводе имени на экран,если оно длиннее определенного,то я его обрезаю,а в конец добавляю три точки...Но почему-то оно выводит обрезанное имя,а потом разный мусор и только в конце ставит три точки...Вот кусок кода:
C++
1
2
3
4
5
6
7
8
if(strlen(name[pos]) > 27)
{
    str = new char[27];
    strncpy(str, name[pos]->name, 24);
    strcat(str, "...");
}
else
    strcpy(str,name[pos]);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
30.07.2009, 13:25     функция strcpy и strcat #2
name[pos]->name, что это?
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:31     функция strcpy и strcat #3
larry, из-за отсутствия кода, тяжело сказать где именно баг.
Есь универсально решение, проинициализируй все используемые тобой строки символом '\0'. Тогда муссор уж точно не должен выходить.
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
30.07.2009, 13:34  [ТС]     функция strcpy и strcat #4
я добавлял в конце strcat(str, '\0'), но все-равно тоже самое...
name[pos]->name-это я опечатался
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:47     функция strcpy и strcat #5
larry, и? добавляет после муссора символ '\0'. а тебе нужно весь муссор заменить '\0'.

попробуй так. Если муссор останется, то муссор у тебя находится в name[pos]->name;

C++
1
2
3
4
5
6
7
if(strlen(name[pos]) > 27)
{
str = new char[27];
memset(str,'\0',27);
strncpy(str, name[pos]->name, 24);
strcat(str, "...");
}
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:10     функция strcpy и strcat #6
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
str = new char[27];
memset(str,'\0',27);
так лучше:
C++
1
char *str = new char[27]();


Добавлено через 16 минут 1 секунду
Monte-Cristo,
C++
1
2
3
str = new char[27]();
strncpy(str, name[pos]->name, 24);
strcat(str, "..."); // 24 + 4 = 28
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 14:10     функция strcpy и strcat #7
Цитата Сообщение от zim22 Посмотреть сообщение
так лучше:
ты думаешь? Компилировал на Visual C++ ? Попробуй на gcc следующий код:

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
    char *str = new char[27]();
    if (str[20]=='\0') cout << "\\0" << endl;
    system("pause"); 
    return 0;
}
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:20     функция strcpy и strcat #8
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Компилировал на Visual C++ ?
угу
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Попробуй на gcc следующий код:
попробовал. условие true. так и должно быть. что не нравится?
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
30.07.2009, 14:54  [ТС]     функция strcpy и strcat #9
Спасибо большое!Все получилось!..
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:55     функция strcpy и strcat #10
Monte-Cristo, если уж на то пошло, всё-равно вы неправильно memset используете
должно быть так:
C++
1
2
char *str = new char[27];
memset(str,'\0',27 * sizeof(char));
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
30.07.2009, 15:04     функция strcpy и strcat #11
zim22, sizeof(char) всегда равен 1, в данном случае это можно не указывать.
Alexandoros
226 / 64 / 4
Регистрация: 02.06.2009
Сообщений: 280
30.07.2009, 15:20     функция strcpy и strcat #12
Цитата Сообщение от zim22 Посмотреть сообщение
Monte-Cristo, если уж на то пошло, всё-равно вы неправильно memset используете
должно быть так:
C++
1
2
char *str = new char[27];
memset(str,'\0',27 * sizeof(char));
Фигню городиш.
sizeof(char) == 1, стандарт, раздел 5.3.3
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 15:31     функция strcpy и strcat #13
zim22, а разница? char = 1-байт. Пока что я не встречал платформы, где это не было бы действительностью (а то что larry пишет под платформу Windows 32-bit я был уверен)

Цитата Сообщение от Monte-Cristo Посмотреть сообщение
char *str = new char[27]();
с этой строкой я не разобрался потому, что я сейчас не дома, и при мне устаревший компилятор gcc (vc++ я не очень сильно доверяю, а инициализация char *str = new char[27](); введена в стандарте 2003 года).
про инициализацию int* n = new int(5) знал, а вот что массивы можно так инициализировать - впервые вижу
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 15:57     функция strcpy и strcat #14
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
zim22, а разница? char = 1-байт.
Standard 5.3.3
sizeof(char) == 1 byte
но байт в понимании Стандарта - это не 8 бит. Может быть и 16
Standard 1.7
The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit. The memory available to a C++ program consists of one or more sequences of contiguous bytes. Every byte has a unique address.
а если у нас не char, а int? или double? или ещё лучше: структура. всё-равно sizeof нужен:
C++
1
2
int *p = new int[8];
memset(p, 0, 8 * sizeof(*p));
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
что я сейчас не дома, и при мне устаревший компилятор gcc
ну вы же в интернете. используйте онлайн компилятор. http://codepad.org

Цитата Сообщение от Monte-Cristo Посмотреть сообщение
а вот что массивы можно так инициализировать - впервые вижу
можно. все члены структуры/типа будут инициализированы значением по умолчанию.
YurA_280784
Заблокирован
30.07.2009, 16:20     функция strcpy и strcat #15
Вот так сделай и будет тебе счастье...
C++
1
2
3
4
char * str = new char[27];
strncpy(str, name[pos]->name, 24);
str[24] = '\0';
strcat(str,"...");
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 16:38     функция strcpy и strcat #16
Цитата Сообщение от zim22 Посмотреть сообщение
но байт в понимании Стандарта - это не 8 бит. Может быть и 16
может, но в соответствии стандарту, под байтом подразумевают 8бит. и программу человек пишет не под специфическии компиляторы, а под стандарт.

Цитата Сообщение от zim22 Посмотреть сообщение
а если у нас не char, а int? или double? или ещё лучше: структура. всё-равно sizeof нужен:
в программировании нет слова если... я писал пример под конкретную задачу.larry это помогло? помогло. продолжать беседу я не вижу смысла, разговор окончен
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 17:08     функция strcpy и strcat #17
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
но в соответствии стандарту, под байтом подразумевают 8бит
ничего подобного. под байтом подразумевается то, что написано в пункте 1.7

Добавлено через 26 минут 2 секунды
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
в программировании нет слова если
есть. if
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
30.07.2009, 17:48     функция strcpy и strcat #18
zim22, ты конечно молодец, но человека с толку сбил!
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
30.07.2009, 17:51     функция strcpy и strcat #19
C++
1
2
3
4
char * str = new char[27];
strncpy(str, name[pos]->name, 24);
str[24] = '\0';
strcat(str,"...");
И будет переполнение буфера.
24 символа + 3 символа + '\0' - итого 28 символов на массив в 27 символов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2009, 18:00     функция strcpy и strcat
Еще ссылки по теме:

C++ В чем разница между функциями strcat() и strcpy()?
Библиотека string.h, функция strcat C++
C++ функция strcat
Своя функция strcat. Копирует мусор C++

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

Или воспользуйтесь поиском по форуму:
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 18:00     функция strcpy и strcat #20
Цитата Сообщение от Lolcht0 Посмотреть сообщение
zim22, ты конечно молодец, но человека с толку сбил!
человек сам себя сбил.
проблема в том, что волшебные круглые скобочки он не добавил
str = new char[size]();
Yandex
Объявления
30.07.2009, 18:00     функция strcpy и strcat
Ответ Создать тему
Опции темы

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