Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция strcat, передача массива в функцию 
:(
    Опции темы
Procoffeev
Дата 27.9.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



Здравствуйте!
вот есть функция:
Код

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 *).

Подскажите пожалуйста как обойти такую проблемку.
Спасибо.
PM MAIL   Вверх
Alexeis
Дата 27.9.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



strcat(bstr1, &bstr[i]);


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Procoffeev
Дата 27.9.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



не прокатит =((

вот проверочный код с &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



Это сообщение отредактировал(а) Procoffeev - 27.9.2008, 23:25
PM MAIL   Вверх
586
Дата 28.9.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Тут надо с символами в строке работать а не со строкой - 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;
}

PM   Вверх
Procoffeev
Дата 28.9.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



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

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

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

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


Это сообщение отредактировал(а) Procoffeev - 28.9.2008, 13:07
PM MAIL   Вверх
Annihilator
Дата 28.9.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



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

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


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Procoffeev
Дата 28.9.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



нет. плохо что весь код не написал сразу, мысли тяжело читать  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++);
    }
}


PM MAIL   Вверх
vinter
Дата 28.9.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

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

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

Это сообщение отредактировал(а) vinter - 28.9.2008, 15:26


--------------------
Мой блог
PM MAIL WWW   Вверх
Procoffeev
Дата 28.9.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



 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) , а лезет в чужое адресное пространство

Это сообщение отредактировал(а) Procoffeev - 28.9.2008, 15:46
PM MAIL   Вверх
586
Дата 28.9.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Зацикливается потому, что в цикле не указано условие, где заканчивается строка.

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

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

PM   Вверх
Procoffeev
Дата 28.9.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2008

Репутация: нет
Всего: нет



Спасибо за объяснение! Разобрался! smile 

Это сообщение отредактировал(а) Procoffeev - 28.9.2008, 21:20
PM MAIL   Вверх
Dov
Дата 29.9.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



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

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




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.