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

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

Войти
Регистрация
Восстановить пароль
 
 
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
#1

Библиотека string.h, функция strcat - C++

04.03.2014, 14:12. Просмотров 1096. Ответов 24
Метки нет (Все метки)

Написал вот такое, но в программе все равно текст не выводит.
Должно работать точно также, как и обычная библиотека strcat.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char * strcat ( char * destination, const char * source )
{
    int size1= sizeof((char*)destination)/sizeof((char*)destination[0]);
    int size2= sizeof((char*)source)/sizeof((char*)source[0]);
    size2=size1+size2;
    int c=0;
    for(int i=size1;i<size2;i++)
    {
        ((char*)destination)[i]=((char*)source)[c];
        c++;
    }
    return ((char*)destination);
}
Где сея ошибка? :\
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 14:12     Библиотека string.h, функция strcat
Посмотрите здесь:

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

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

функция strcpy и strcat - C++
Добрый день!У меня такая проблема...Есть массив строк, где хранятся имена и при выводе имени на экран,если оно длиннее определенного,то я...

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

Своя функция strcat, завершение с ошибкой - C++
Здравствуйте, написал свою функцию strcat, она выполняет то, что от нее нужно, но сама программа при этом завершается с ошибкой. void...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex5
1048 / 711 / 104
Регистрация: 12.04.2010
Сообщений: 1,789
04.03.2014, 14:24     Библиотека string.h, функция strcat #2
Цитата Сообщение от Nick Deny Посмотреть сообщение
int size1= sizeof((char*)destination)/sizeof((char*)destination[0]);
int size2= sizeof((char*)source)/sizeof((char*)source[0]);
Это то же самое, что int size1 = sizeof( char* ) / sizeof( char* );
size1 и size2 всегда получаются равными 1
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
04.03.2014, 14:26     Библиотека string.h, функция strcat #3
Ошибка тут:
C++
1
2
int size1= sizeof((char*)destination)/sizeof((char*)destination[0]);
int size2= sizeof((char*)source)/sizeof((char*)source[0]);
через sizeof нельзя определить длину строки, т.к. он работает на этапе компиляции.
sizeof вычисляет размер типа данных, в данном случае в size1 и size2 будут - 1.
На x86 32 bit оно так:
C++
1
2
3
sizeof((char*)destination)) == 4
sizeof(destination[0]) == 1
sizeof((char*)destination[0]) == 4
Используй strlen для подсчета длины строки.
Убери (char*) - они не нужны здесь.
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 14:28  [ТС]     Библиотека string.h, функция strcat #4
Alex5,
Как тогда узнать размер destination и source, чтобы склеить строки? (Я так понял, нужно посчитать размер 2 массивов, добавить их и тогда через for добавить 2ой массив к первому.)

Добавлено через 1 минуту
DrOffset,
Я пишу идентичную string.h библиотеку, strlen'а в ней нет, добавлять string.h нельзя. Если в моей библиотеке будет strlen, я смогу его использовать в этой же библиотеке?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
04.03.2014, 14:29     Библиотека string.h, функция strcat #5
Nick Deny, раз так, напиши собственный strlen - это очень просто

А еще лучше реализовать strcat так, что бы прямой вызов strlen был не нужен.
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 14:32  [ТС]     Библиотека string.h, функция strcat #6
DrOffset,
Если в моей библиотеке будет strlen, я смогу его использовать в этой же библиотеке?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
04.03.2014, 14:32     Библиотека string.h, функция strcat #7
Nick Deny, почему нет? главное чтобы не было пересечения со стандартными.
Alex5
1048 / 711 / 104
Регистрация: 12.04.2010
Сообщений: 1,789
04.03.2014, 14:38     Библиотека string.h, функция strcat #8
Цитата Сообщение от Nick Deny Посмотреть сообщение
Как тогда узнать размер
Признак конца строки - нулевой байт. size1 - размер строки destination означает, что
C++
1
2
3
4
5
destination[0] != 0
destination[1] != 0
destination[2] != 0
...
destination[size1] == 0
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 14:44  [ТС]     Библиотека string.h, функция strcat #9
Еще одно, вернуть массив символов?
Например, char * destination - массив char, в котором 80 символов.
Как правильно,
C++
1
2
3
4
for(int i=0;i<...;i++)
{
return destination[i];
}
или
C++
1
return destination;
вернет весь массив?
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
04.03.2014, 14:45     Библиотека string.h, функция strcat #10
Вот примерный код strlen

C++
1
2
3
4
5
6
7
8
9
10
11
int strlen (char* s)
{
    int size = 0;;
    
    while (s != '\0')
   {
         size++;
         s++;
    }
     return size;
}
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 15:10  [ТС]     Библиотека string.h, функция strcat #11
Вот так, кстати, правильно.
C++
1
2
3
4
5
6
7
8
9
int strlen (char* s)
{
    int size = 0;
    while (s[size] != '\0')
   {
         size++;
    }
     return size;
}
Добавлено через 5 минут
Все равно лажа, отображает неведомые мне символы...
Всякие крючки, палочки и т.п.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char * strcat ( char * destination, const char * source )
{
    int s1=0;
    int s2=0;
    while(destination[s1]!='\0')
    {
        s1++;
    }
    while(source[s2]!='\0')
    {
        s2++;
    }
    s2=s1+s2;
    int c=0;
    for(int i=s1;i<s2;i++)
    {
        ((char*)destination)[s1]=((char*)source)[c];
        c++;
    }
    return (char*)destination;
}
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
04.03.2014, 15:21     Библиотека string.h, функция strcat #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nick Deny Посмотреть сообщение
Все равно лажа
Все гораздо проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char * strcat(char * dest, const char * src)
{
    char * r = dest;
 
    while (*dest != '\0')
        dest++;
 
    while ((*dest++ = *src++) != '\0')
        continue;
 
    return r;
}
Ну и я говорил про (char*), что они не нужны здесь.

Добавлено через 5 минут
Исправил и твой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char * strcat ( char * destination, const char * source )
{
    int s1=0;
    int s2=0;
    while(destination[s1] != '\0')
    {
        s1++;
    }
    while(source[s2] != '\0')
    {
        s2++;
    }
    s2 = s1 + s2;
    int c = 0;
    for(int i = s1; i < s2; i++)
    {
        destination[i] = source[c++];
    }
    return destination;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.03.2014, 15:23     Библиотека string.h, функция strcat #13
Цитата Сообщение от DrOffset Посмотреть сообщение
while ((*dest++ = *src++) != '\0') continue;
Почти классический вариант копирования:
C++
1
while ((*dest++ = *src++));
DrOffset
04.03.2014, 15:33
  #14

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Почти классический вариант копирования
Да, я знаю. continue и вправду был лишний. А вот сравнение с нулем я бы все равно оставил. так и нагляднее и нет неявного преобразования char->bool

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 15:40     Библиотека string.h, функция strcat
Еще ссылки по теме:

Библиотека String - C++
Чем плох String? Когда его не стоит использовать?

Строки библиотека string.h - C++
Дана строка символов, состоящая из букв и цифр. Найти количество букв в данной строке. Использовать функции библиотеки string.h

считывание строки( библиотека string) - C++
задача в том чтоб считать сообщение с клавиатуры полностью(русские буквы пробелы знаки всякие). Пытался сделать с помощью string, не...

Библиотека Обработки строк string.h - C++
Задание таково: Разработайте программу работы со строками. Организуйте ввод исходных данных с клавиатуры. Используйте функции из библиотеки...

Библиотека для удобной работы с типом string с++ - C++
Привет, надо проводить много манипуляций со строками - обрезка, перенос строки, выравнивание - для интерфейса 3D-игры. Есть ли готовая...


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

Или воспользуйтесь поиском по форуму:
Tulosba
04.03.2014, 15:40     Библиотека string.h, функция strcat
  #15

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
так и нагляднее и нет неявного преобразования char->bool
Имхо, в плюсах писать в условии != 0 (или != '\0', что по сути, то же самое), избыточно. И имеет смысл только для новичков, не знающих о правиле преобразования интегральных типов в булев.

Yandex
Объявления
04.03.2014, 15:40     Библиотека string.h, функция strcat
Ответ Создать тему
Опции темы

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