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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 5.00
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
#1

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

30.07.2009, 13:20. Просмотров 3805. Ответов 20
Метки нет (Все метки)

Добрый день!У меня такая проблема...Есть массив строк, где хранятся имена и при выводе имени на экран,если оно длиннее определенного,то я его обрезаю,а в конец добавляю три точки...Но почему-то оно выводит обрезанное имя,а потом разный мусор и только в конце ставит три точки...Вот кусок кода:
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]);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2009, 13:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос функция strcpy и strcat (C++):

В чем разница между функциями strcat() и strcpy()? - C++
В чем разница между функциями strcat() и strcpy()?

Реализовать собственные функции strcat, strcpy, strcmp, strlen - C++
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции strcat, strcpy, strcmp, strlen. Для strlen реализовал, а...

Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки) - C++
вот задание: Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat из стандартной библиотеки cstring (string.h). ...

Функция strcat - C++
Нужно написать прогу на C++ и Ассемблере...функцмя strcat(на ассемблере сделал а вот на C++ не могу).Если кто поможет буду очень...

функция strcat - C++
Помогите разобраться, пожалуйста. char* resultat = 0; char* str = "abc"; strcat(resultat, str); вылетает с ошибкой. Как нужно...

Что делает функция strcat(t, f) - C++
Функция strcat(t, f) что она делает и как применяеться?

20
kazak
3057 / 2378 / 160
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
30.07.2009, 13:25 #2
name[pos]->name, что это?
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:31 #3
larry, из-за отсутствия кода, тяжело сказать где именно баг.
Есь универсально решение, проинициализируй все используемые тобой строки символом '\0'. Тогда муссор уж точно не должен выходить.
0
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
30.07.2009, 13:34  [ТС] #4
я добавлял в конце strcat(str, '\0'), но все-равно тоже самое...
name[pos]->name-это я опечатался
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:47 #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, "...");
}
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:10 #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
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 14:10 #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;
}
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:20 #8
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Компилировал на Visual C++ ?
угу
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Попробуй на gcc следующий код:
попробовал. условие true. так и должно быть. что не нравится?
0
larry
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 59
30.07.2009, 14:54  [ТС] #9
Спасибо большое!Все получилось!..
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:55 #10
Monte-Cristo, если уж на то пошло, всё-равно вы неправильно memset используете
должно быть так:
C++
1
2
char *str = new char[27];
memset(str,'\0',27 * sizeof(char));
0
Gravity
569 / 563 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
30.07.2009, 15:04 #11
zim22, sizeof(char) всегда равен 1, в данном случае это можно не указывать.
0
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
30.07.2009, 15:20 #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
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 15:31 #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) знал, а вот что массивы можно так инициализировать - впервые вижу
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 15:57 #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 Посмотреть сообщение
а вот что массивы можно так инициализировать - впервые вижу
можно. все члены структуры/типа будут инициализированы значением по умолчанию.
0
YurA_280784
Заблокирован
30.07.2009, 16:20 #15
Вот так сделай и будет тебе счастье...
C++
1
2
3
4
char * str = new char[27];
strncpy(str, name[pos]->name, 24);
str[24] = '\0';
strcat(str,"...");
0
30.07.2009, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2009, 16:20
Привет! Вот еще темы с ответами:

Библиотека string.h, функция strcat - C++
Написал вот такое, но в программе все равно текст не выводит. Должно работать точно также, как и обычная библиотека strcat. char *...

Функция strcpy - C++
цель очевидна. почему не работает? :-| #include &lt;iostream&gt; void strcpy(char *from, char *to) { to=from; } int main() { ...

Собственная функция strcat -сцепление строк - C++
написать собственную функцию strcat -сцепление строк. Сравнить работу функции со стандартной из библиотеки string.h, если таковая...

Своя функция strcat. Копирует мусор - C++
Не могу как сделать так, что бы копирование происходило несколько раз. char *Copies(const char *s, char *s1, int n) { for...


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

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

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