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

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

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

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

04.03.2014, 14:12. Просмотров 1130. Ответов 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);
}
Где сея ошибка? :\
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 14:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Библиотека string.h, функция strcat (C++):

Функция 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 -сцепление строк. Сравнить работу функции со стандартной из библиотеки string.h, если таковая...

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

24
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 15:44  [ТС] #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 )
0
DrOffset
04.03.2014, 15:46
  #17

Не по теме:

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

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

Не по теме:

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

1
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 16:02  [ТС] #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. :\
0
DrOffset
04.03.2014, 16:08
  #20

Не по теме:

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

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

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

0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.03.2014, 16:08 #21
Nick Deny, сделайте вместо
C++
1
2
while ((*dest++ = *src++) != '\0')
        continue;
так:
C++
1
while (num-- && (*dest++ = *src++));
1
DrOffset
7315 / 4415 / 1000
Регистрация: 30.01.2014
Сообщений: 7,252
04.03.2014, 16:09 #22
Цитата Сообщение от Nick Deny Посмотреть сообщение
Не выдает ничего
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char * strncat(char * dest, const char *src, size_t count)
{
    char * r = dest;
 
    while(*dest != 0)
        ++dest;
 
    char c;
    while((count-- > 0) && ((c = *src++) != 0))
        *dest++ = c;
 
    *dest++ = 0;
 
    return r;
}
1
Tulosba
04.03.2014, 16:13
  #23

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Ага, а потом появляются идиомы наподобие этой.
С++11 это уже не требует реализовать. Есть явные преобразования типов.
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет смысла вводить правило, когда исключений больше.
Исключения это что? Пользовательские типы? Конечно их будет больше, чем фундаментальных.
Цитата Сообщение от DrOffset Посмотреть сообщение
Но ты первое свое утверждение привел в общем случае
Mea culpa. Имел ввиду встроенные типы.

0
Nick Deny
2 / 2 / 0
Регистрация: 17.11.2012
Сообщений: 43
04.03.2014, 16:24  [ТС] #24
И последнее. Выдает, что буква 's' найдена в каждом символе.
Код:
C++
1
2
3
4
5
6
7
8
9
10
    cout<<"\n\n= = = = =\nStart!\n\nstrchr:"<<endl;
  char str[] = "This is a sample string";
  char * pch;
  printf ("Looking for the 's' character in \"%s\"...\n",str);
  pch=strchr(str,'s');
  while (pch!=NULL)
  {
    printf ("found at %d\n",pch-str+1);
    pch=strchr(pch+1,'s');
  }
Функция:
C++
1
2
3
4
5
6
7
8
9
10
11
char * strchr (char * str, int character )
{
    char * r=str;
    for(int i=0;i<strlen(str);i++)
    {
        if(str[i]==character)
            return r;
        else
            continue;
    }
}
0
DrOffset
7315 / 4415 / 1000
Регистрация: 30.01.2014
Сообщений: 7,252
04.03.2014, 16:33 #25

Не по теме:

Tulosba, я просто не вижу смысла в этой краткости, если есть хоть 1%, что из-за нее где-то выстрелит в ногу. Я слишком много проектов перевидел и сидел на поддержке, чтобы так просто этим разбрасываться. Так же самая история с ++i вместо i++ в цикле, для встроенных типов не играет роли. Но зачем всякий раз думать о том, что встроенный тип - это одно, а в случае итератора, может быть оверхед?

В случае встроенных типов на уровне кодогенерации почти всегда будет полный эквивалент. Скатываться в perl-подобный синтаксис из-за каких-то религиозных мотивов?

С++11 это уже не требует реализовать.
Я согласен. Но я еще не видел ни одного программного продукта (именно продукта), который бы не имел обратную совместимость С++03. И это текущих условиях пока что является оправданным.



Добавлено через 6 минут
Цитата Сообщение от Nick Deny Посмотреть сообщение
И последнее
C++
1
2
3
4
5
6
7
8
9
10
11
12
char * strchr(char * sp, int c)
{
    do
    {
        if(*sp == static_cast<char>(c))
        {
            return sp;
        }
    }
    while(*sp++ != 0);
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 16:33
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
25
Yandex
Объявления
04.03.2014, 16:33
Ответ Создать тему
Опции темы

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