Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
2 / 2 / 1
Регистрация: 27.07.2009
Сообщений: 75

функция strcpy и strcat

30.07.2009, 13:20. Показов 6492. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2009, 13:20
Ответы с готовыми решениями:

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

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

Для класса String перегрузить функции strcpy, strcat
Подскажите пожалуйста, не пойму само задание из Дейтела. Изучаю главу перегрузки операций. "Изучите функции библиотеки...

20
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
30.07.2009, 13:25
name[pos]->name, что это?
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:31
larry, из-за отсутствия кода, тяжело сказать где именно баг.
Есь универсально решение, проинициализируй все используемые тобой строки символом '\0'. Тогда муссор уж точно не должен выходить.
0
2 / 2 / 1
Регистрация: 27.07.2009
Сообщений: 75
30.07.2009, 13:34  [ТС]
я добавлял в конце strcat(str, '\0'), но все-равно тоже самое...
name[pos]->name-это я опечатался
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 13:47
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
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:10
Цитата Сообщение от 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
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 14:10
Цитата Сообщение от 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
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:20
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Компилировал на Visual C++ ?
угу
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Попробуй на gcc следующий код:
попробовал. условие true. так и должно быть. что не нравится?
0
2 / 2 / 1
Регистрация: 27.07.2009
Сообщений: 75
30.07.2009, 14:54  [ТС]
Спасибо большое!Все получилось!..
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 14:55
Monte-Cristo, если уж на то пошло, всё-равно вы неправильно memset используете
должно быть так:
C++
1
2
char *str = new char[27];
memset(str,'\0',27 * sizeof(char));
0
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
30.07.2009, 15:04
zim22, sizeof(char) всегда равен 1, в данном случае это можно не указывать.
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
30.07.2009, 15:20
Цитата Сообщение от 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
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 15:31
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
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 15:57
Цитата Сообщение от 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
Заблокирован
30.07.2009, 16:20
Вот так сделай и будет тебе счастье...
C++
1
2
3
4
char * str = new char[27];
strncpy(str, name[pos]->name, 24);
str[24] = '\0';
strcat(str,"...");
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 16:38
Цитата Сообщение от zim22 Посмотреть сообщение
но байт в понимании Стандарта - это не 8 бит. Может быть и 16
может, но в соответствии стандарту, под байтом подразумевают 8бит. и программу человек пишет не под специфическии компиляторы, а под стандарт.

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

Добавлено через 26 минут 2 секунды
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
в программировании нет слова если
есть. if
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
30.07.2009, 17:48
zim22, ты конечно молодец, но человека с толку сбил!
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
30.07.2009, 17:51
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 символов.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 18:00
Цитата Сообщение от Lolcht0 Посмотреть сообщение
zim22, ты конечно молодец, но человека с толку сбил!
человек сам себя сбил.
проблема в том, что волшебные круглые скобочки он не добавил
str = new char[size]();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2009, 18:00
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru