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

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

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

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

04.03.2014, 14:12. Просмотров 1044. Ответов 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex5
1038 / 701 / 102
Регистрация: 12.04.2010
Сообщений: 1,763
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
6857 / 4068 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
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
6857 / 4068 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
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
6857 / 4068 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
04.03.2014, 14:32     Библиотека string.h, функция strcat #7
Nick Deny, почему нет? главное чтобы не было пересечения со стандартными.
Alex5
1038 / 701 / 102
Регистрация: 12.04.2010
Сообщений: 1,763
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
120 / 120 / 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
6857 / 4068 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
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
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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

Tulosba
04.03.2014, 15:40
  #15

Не по теме:

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

Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 15:44  [ТС]     Библиотека string.h, функция strcat #16
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;
}
Хм.. Как теперь сделать из этого strncat?
Пытался поменять '\0' на num - лажа.

p.s.
C++
1
char * strncat ( char * dest, const char * src, size_t num )
DrOffset
04.03.2014, 15:46
  #17

Не по теме:

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

Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.03.2014, 15:58     Библиотека string.h, функция strcat #18
Цитата Сообщение от Nick Deny Посмотреть сообщение
Как теперь сделать из этого strncat?
добавить счетчик в цикл копирования и выход из цикла при достижении кол-ва символов.

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
bool так то тоже интегральный тип.
да, но внутри if'а всё же интуитивно ожидается булев тип (провожу аналогии с C#, где bool должен быть явным).
Цитата Сообщение от DrOffset Посмотреть сообщение
А в плюсах с его пользовательскими операторами приведения
Пользовательские операторы для пользовательских типов, в данном случае char не получится трактовать как-то ошибочно. Кстати, в качестве типа из стандартной библиотеки можно привести пример с std::ios::operator bool. Добавлен как раз для сокращения записи при проверки условия.

Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 16:02  [ТС]     Библиотека string.h, функция strcat #19
Не выдает ничего, видимо, ошибка в расчете где- то.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char * strncat ( char * dest, const char * src, size_t num )
{
    char * r = dest;
    int c=0;
    while(*dest!='\0')
        c++;
    for(int i=0;i<num;i++)
    {
        dest[c]= src[i];
        c++;
    }
    return r;
}
oh. :\
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 16:08     Библиотека string.h, функция strcat
Еще ссылки по теме:

считывание строки( библиотека string) C++
Библиотека Обработки строк string.h C++
C++ функция strcat
Своя функция strcat. Копирует мусор C++
C++ Библиотека String

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

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

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
да, но внутри if'а всё же интуитивно ожидается булев тип
Ожидается да. Я где-то другое утверждал? Я говорю о регламентации своих действий. Да в этом конкретном случае оно будет эквивалентно. Но во многих других - нет. Нет смысла вводить правило, когда исключений больше.

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

Цитата Сообщение от Tulosba Посмотреть сообщение
Кстати, в качестве типа из стандартной библиотеки можно привести пример с std::ios::operator bool. Добавлен как раз для сокращения записи при проверки условия.
Ага, а потом появляются идиомы наподобие этой.

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

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