Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему так происходит?

11K
16 сентября 2005 года
Russish
6 / / 25.07.2005
Код:
char* rev(char* p)
{
        char x='c';
    char* q=&x;
//не знаю как по-нормальному инициализировать
    int len=strlen(p);
    for (int i=len,j=0;i>-1;i--,j++)
    {
        *(q+j)=*(p+i-1);
    };
    return q;
}

char* cat(char* p,const char* q)
{
    char len=strlen(p);
    for (int i=0;i<strlen(p);i++){
        if (strlen(q)!=i) *(p+i+len)=*(q + i);
    };
    return p;
}


Собственно cat & rev - аналоги (по результату) функций из string.h, но почему cat работает нормально, а rev возвращает какую-то ерунду?
247
16 сентября 2005 года
wanja
1.2K / / 03.02.2003
br /> char* rev(char* p)
{
char x='c';
char* q=&x;
//не знаю как по-нормальному инициализировать
int len=strlen(p);
for (int i=len,j=0;i>-1;i--,j++)
{
*(q+j)=*(p+i-1);
};
return q;
}

Собственно cat & rev - аналоги (по результату) функций из string.h, но почему cat работает нормально, а rev возвращает какую-то ерунду?


Еще бы, ты же ее записываешь неведомо куда, а затем возвращаешь локальную переменную. Надо так:
char* rev(char* s)
{
char* p=s;
char* p1=s;
//не знаю как по-нормальному инициализировать
int len=strlen(p);
p1+=len;
for (int i=0;i<len/2;i++)
{
char h=*p;
*p=*p1;
*p1=h;
p++;
p1--;
};
return s;
}

3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by wanja
Еще бы, ты же ее записываешь неведомо куда, а затем возвращаешь локальную переменную. Надо так:
char* rev(char* s)
{
char* p=s;
char* p1=s;
//не знаю как по-нормальному инициализировать
int len=strlen(p);
p1+=len;
for (int i=0;i<len/2;i++)
{
char h=*p;
*p=*p1;
*p1=h;
p++;
p1--;
};
return s;
}



Сдается мне, что твой вариант работает неверно. :о)

406
16 сентября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Green
Сдается мне, что твой вариант работает неверно. :о)



Green прав. тогда уж так:

char* rev(char* s)
{
char* p=s;
char* p1=s;
//не знаю как по-нормальному инициализировать
int len=strlen(p);
p1+=len-1;//здесь была ошибка
for (int i=0;i<len/2;i++)
{
char h=*p;
*p=*p1;
*p1=h;
p++;
p1--;
};
return s;
}

3
17 сентября 2005 года
Green
4.8K / / 20.01.2000
Тогда уж давайте причешем этот лохматый код:
Код:
char* rev(char* str)
{
  char* forwardIterator = str;
  char* reverseIterator = str + strlen(str) - 1;
  while(forwardIterator < reverseIterator)
  {
    forwardIterator ^= reverseIterator;
    reverseIterator ^= forwardIterator;
    forwardIterator ^= reverseIterator;
    forwardIterator++;
    reverseIterator--;
  }
  return str;
}
488
17 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Green
Тогда уж давайте причешем этот лохматый код:
Код:
char* rev(char* str)
{
  char* forwardIterator = str;
  char* reverseIterator = str + strlen(str) - 1;
  while(forwardIterator < reverseIterator)
  {
    forwardIterator ^= reverseIterator;
    reverseIterator ^= forwardIterator;
    forwardIterator ^= reverseIterator;
    forwardIterator++;
    reverseIterator--;
  }
  return str;
}

Тогда уж давайте исправим код, чтоб он был не только красивым, но и компилировался бы, и вместо переставления адресов, переставлял бы буквы слова:

Код:
char* rev(char* str)
{
  char* forwardIterator = str;
  char* reverseIterator = str + strlen(str) - 1;
  while(forwardIterator < reverseIterator)
  {
    *forwardIterator = *forwardIterator^*reverseIterator;
    *reverseIterator = *forwardIterator^*reverseIterator;
    *forwardIterator = *forwardIterator^*reverseIterator;
    forwardIterator++;
    reverseIterator--;
  }
  return str;
}
3
17 сентября 2005 года
Green
4.8K / / 20.01.2000
Ок, согласен, я очепятался. Не написал звездочек.

Только вот, скажи на кой нужны такие динозавры:
*forwardIterator = *forwardIterator^*reverseIterator;

Мы же не на бейсике пишем.

*forwardIterator ^= *reverseIterator;
488
18 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Green
Ок, согласен, я очепятался. Не написал звездочек.

Только вот, скажи на кой нужны такие динозавры:
*forwardIterator = *forwardIterator^*reverseIterator;

Мы же не на бейсике пишем.

*forwardIterator ^= *reverseIterator;

Ты прав. Но я только расскрыл операторы, чтоб посчитать, что ради красоты насколько больше операций выполняется, чем это необходимо. А потом, забыл "закрыть" операторы.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог