Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > функция strcat


Автор: Procoffeev 27.9.2008, 21:13
Здравствуйте!
вот есть функция:
Код

void invert_code(char *bstr,char *bstr1)
{
    strcpy(bstr1,"");

    for (int i=strlen(bstr)-1; i>=0; i--)
        strcat(bstr1, bstr[i]);

    cout<<bstr1<<endl;
}


собственно вопрос... strcat фыркает на bstr[i] c типом (char), так как второй параметр должен быть (const char *).

Подскажите пожалуйста как обойти такую проблемку.
Спасибо.

Автор: Alexeis 27.9.2008, 21:28
strcat(bstr1, &bstr[i]);

Автор: Procoffeev 27.9.2008, 23:24
не прокатит =((

вот проверочный код с &bstr[i]:

Код

void invert_code(char *bstr,char *bstr1)
{
    strcpy(bstr1,"");

    for (int i=strlen(bstr)-1; i>=0; i--)
        cout<<&bstr[i]<<endl;
}


выводит:

Код

1
01
101
1101


Автор: 586 28.9.2008, 00:37
Тут надо с символами в строке работать а не со строкой - strcat здесь не нужен.
Код
#include <stdio.h>

void invert_code(const char *src, char *dst)
{
    const char *s = &src[strlen(src)-1];
    char *d = dst;

    while(s >= src)
    {
        *(d++) = *(s--);
    }

    *d = 0;
}

int main(int argc, char *argv[])
{
    char d[64];
    const char *s = "Hello world";


    invert_code(s, d);

    puts(s);
    puts(d);

    getchar();

    return 0;
}

Автор: Procoffeev 28.9.2008, 12:34
все работает! Спасибо!
только не могу понять запись: while(s >= src), это значит пока адрес s больше или равен адреса src?

попробовал с другим условием:
Код

 const char *s = &src[0];
....
while(s<=src)
....

программа зацикливается, и выдает всякую чушь

Автор: Annihilator 28.9.2008, 13:33
Цитата(Procoffeev @  28.9.2008,  16:34 Найти цитируемый пост)
программа зацикливается, и выдает всякую чушь

это и понятно. Ты устанавлиаешь указатель на нулевой элемент (условие равенства), а потом уменьшаешь в цикле (для наглядности, что-то типа s = -1;-2;-3...) выполняется условия "меньше"

Автор: Procoffeev 28.9.2008, 14:04
нет. плохо что весь код не написал сразу, мысли тяжело читать  smile 

вот код:
Код

void invert_code(const char *src, char *dst)
{
    const char *s = &src[0];
    char *d = dst;
    while(s <= src)      // or while(s < src)
    {
        *(d++) = *(s++);
    }
}


Автор: vinter 28.9.2008, 15:26
Код

void invert_code(const char *src, char *dst)
{
      for( ; *d++ = *s++; )
}

это если у тебя символьная строка с завершающим нулем. Если нет, то надо передавать размер.. А вообще почему ф-ия называеться инверт? это же обычный strcpy

Автор: Procoffeev 28.9.2008, 15:41
 invert_code потому что она таковой и была с начала, но потом я задал другой вопрос:

пост выше:
Код
все работает! Спасибо!
только не могу понять запись: while(s >= src), это значит пока адрес s больше или равен адреса src?

попробовал с другим условием:

void invert_code(const char *src, char *dst)
{
    const char *s = &src[0];
    char *d = dst;
    while(s <= src)      // or while(s < src)
    {
        *(d++) = *(s++);
    }
}

программа зацикливается, и выдает всякую чушь

т.е. программа не останавливается на условии while(s <= src) , а лезет в чужое адресное пространство

Автор: 586 28.9.2008, 17:01
Зацикливается потому, что в цикле не указано условие, где заканчивается строка.

Си-шные строки заканчиваются нулевым символом.

Коротко это записывается так:
Код
void my_strcpy(const char *s, char *d)
{
    while(*(d++) = *(s++)) ;
}

Автор: Procoffeev 28.9.2008, 21:18
Спасибо за объяснение! Разобрался! smile 

Автор: Dov 29.9.2008, 15:25
Цитата(Procoffeev @  27.9.2008,  21:13 Найти цитируемый пост)
собственно вопрос... strcat фыркает на bstr[i] c типом (char), так как второй параметр должен быть (const char *).Подскажите пожалуйста как обойти такую проблемку.

Самое простое, на мой взгляд, это использовать strncat вместо strcat:
Код
strncat(bstr1, bstr + i, 1);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)