powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто знает самую короткую и красивую функцию переворота строки?
19 сообщений из 69, страница 3 из 3
Кто знает самую короткую и красивую функцию переворота строки?
    #32922361
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сообщил модератору :-)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922471
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не понял... никто ещё не понял, что моя функция самая короткая и быстрая? :)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922559
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebentearbeitЯ не понял... никто ещё не понял, что моя функция самая короткая и быстрая? :)

Твое решение быстрое ... но требует дополнительной памяти.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32923455
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Второй вариант, который от СЕМЬ, не требует дополнительной памяти.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32923739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebentearbeitВторой вариант, который от СЕМЬ, не требует дополнительной памяти.

Не возражаю. Теперь неплохо-бы тест производительности написать. Скажем 1000 тестовых вызовов функции str_reverse. Только не для слова "Hack" а для чего-нибудь посолиднее. Поставить #define _UNICODE.

И сравнительная таблица времени выполнения для:

1) str_reverse - чистый C++
2) STL реализация переворота строки
3) СString строки (желательно встроенный метод)
4) TString строки (желательно встроенный метод)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32924550
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebentearbeitВторой вариант, который от СЕМЬ, не требует дополнительной памяти.
Код: plaintext
1.
 *s++=(*p--=(*s=*s^*p)^*p)^*s;
Три присваивания, инкремент, декремент, три XOR-а причем с переменными, а не с константами - вряд ли это самый быстрый выриант (это не считая вызова функции strlen), а если ввести промежуточную переменную типа char:
Код: plaintext
1.
 c=*p;  *p--=*s;  *s++=c;
то будет только три присваивания, инкремент, декремент.
Поэтому метод Дуброва, модифицированный мной, побыстрее будет, IMHO

Жаль только, что разницу в скорости вряд ли кто заметит
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32925524
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, с XOR'ами, я перестарался... но добивался красоты,
а с strlen не такая уж и большая.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32925546
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для многих платформ проверка условия цикла на 0 идет быстрее чем сравнение двух переменных. На моей машине 100 млн вызовов функции занимют 15 сек. Пробуйте другие варианты если есть желание.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#include <stdio.h>
#include <string.h>

void str_rev(char *s)
{
	if (s==NULL) return;
	int l=strlen(s);
	if (l== 1 ) return;
	char *p1=s;
	char *p2=s+l- 1 ;
	char ts;
	l>>= 1 ;
	while(l) {
		ts=*p1;
		*p1++=*p2;
		*p2--=ts;
		l--;
	}
}

int main()
{	
	// Mayton's reverse string function
	//  15  sec ( 100000000  callbacks) 
	// ( Celeron  1700 / 512  )
	char *s="А роза упала на лапу Азора 1234567890_";
	for(long k= 0 ;k< 100000000 ;k++){
		str_rev(s);
	}
	return  0 ;
}

P.S. Для UNICODE еще не тестировал.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32927402
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
mДля многих платформ проверка условия цикла на 0

просто для условий получается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 385 :      if(i== 0 )
00407EA0   cmp         dword ptr [i ( 00423090 )], 0 
00407EA7   jne         CTestButButDlg::OnInitDialog+53h (00407eb3)
 386 :          i= 2 ;
00407EA9   mov         dword ptr [i ( 00423090 )], 2 
 387 :      if(i== 5 )
00407EB3   cmp         dword ptr [i ( 00423090 )], 5 
00407EBA   jne         CTestButButDlg::OnInitDialog+66h (00407ec6)
 388 :          i= 7 ;

а while тоже самое выдал:
Код: plaintext
1.
2.
3.
4.
5.
6.
 391 :      while(i!= 0 )i--;
00407ED6   cmp         dword ptr [i ( 00423090 )], 0 
00407EDD   je          CTestButButDlg::OnInitDialog+8Eh (00407eee)
00407EDF   mov         eax,[i ( 00423090 )]
00407EE4   sub         eax, 1 
00407EE7   mov         [i ( 00423090 )],eax
00407EEC   jmp         CTestButButDlg::OnInitDialog+76h (00407ed6)

Ничё не пойму...
tst работает быстрее чем cmp ведь?
и dec быстрее чем sub...
Это потому что под дебагом нет оптимизации? Или MS компилятор такой?
Хотя, помню, если умножать на 2(4,8) он оптимизирует сдвигом....
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32927422
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebentearbeitДайте и мне шашкой помахать :)

Код: plaintext
1.
2.
char bck[MAX_PATH], str[MAX_PATH]="back", *p=bck, *s=str;
*(p+=strlen(str))--= 0  ;
while(*p-- = *s++);

JibSkeart, ты письмо получил?

Неа , что то не вижу писем никаких ...
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32927425
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DubrovА ввобще, давайте перенесем это обсуждение из "C++" в "Программирование", интересно как эту задачу решат люди сидящие на других языках. Просто я не знаю как это сделать, с кем договариваться (с модератором, наверное?).
---
С уважением, Dubrov.

Можно , просто ссылку дать :)
То есть завести , новый топик там и в нем указать сЦылку !
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32934112
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про atoi.
Переполнение проверять не надо, а вот систему счисления надо.
Если 123 - decimal
0123 - octal
0x123 - hex
Свой вариант предложу позже.
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32934163
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATOI:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
int my_atoi(const char *str)
{
  int sign= 1 ;  //Знак
  int num= 0 ;  //Результат
  int base= 10 ;//Основание системы счисления
  int d;  //Текущий разряд

  switch(*str)
  {
  case '-': sign=- 1 ;
  case '+': str++;
  }

  if(*str=='0')
  {
    base= 8 ;
    str++;
    if((*str=='x')||(*str=='X'))
    {
      base= 16 ;
      str++;
    }
  }

  while((d=c-'0')!=-'0')
  {
    if(d> 9 )
      if((d>='a'-'0')&&(d>='f'-'0'))d-=('a'-'0'- 10 );
      else if ((d>='A'-'0')&&(d>='F'-'0'))d-=('A'-'0'- 10 );
            else d=- 1 ;

      if((d< 0 )||(d>=base))break;
      else num=base*num+d;
  }
  
  return sign*num;
}
Возможно я где-то ошибся, набивал с бумажки, так что sorry.
Программа, как я чувствую очень платформенно-зависимая (Кодировка - только ASCII).
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32937050
Yossarian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не быстро. Не коротко. Но красиво.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>


void strev2(char *src, char **dst)
{
	char c=*src; 
	if (c)
	{
		strev2(src+ 1 ,dst);
		*((*dst)++)=c; 
	}
}

void strev(char *src)
{
	char *d=src;
	strev2(src,&d);
}

int main(int argc, char* argv[])
{
	char *dd=(char*)malloc( 10 );
	strcpy(dd,"1234567");

	strev(dd);

	printf(dd);
	return  0 ;
}

Washington Irving
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32946242
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут где-то проскакивало, что по тому как человек написал программу можно определить его характер, мышление и т.д. Вот пример atoi. Массив хоть и относительно большой (256*sizeof(int)) зато какой простой цикл.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
#include <iostream>
#include <limits>

int my_atoi(const char *str)
{
  static const int v[]=
  {
    INT_MAX, //0x00
    ...
    INT_MAX, //'0'-1
     0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , //'0'-'9'
    INT_MAX, //'9'+1
    ...
    INT_MAX, //'A'-1
     10 , 11 , 12 , 13 , 14 , 15 , //'A'-'F'
    INT_MAX, //'F'+1
    ...
    INT_MAX, //'a'-1
     10 , 11 , 12 , 13 , 14 , 15 , //'a'-'f'
    INT_MAX, //'f'+1
    ...
    INT_MAX //0xff
  };

  int sign=+ 1 ;
  int num= 0 ;
  int base= 10 ;
  int d;

  switch(*str)
  {
  case '-': sign=- 1 ;
  case '+': str++;
  }

  if(*str=='0')
  {
    base= 8 ;
    str++;
    if((*str=='x')||(*str=='X'))
    {
      base= 16 ;
      str++;
    }
  }

  while((d=v[unsigned(*str++)])<base)num=base*num+d;

  return sign*num;
}

void main(void)
{
  char str[ 32 ];
  cout<<"Input  value : ";
  cin>>str;
  cout<<"Output value : "<<my_atoi(str)<<endl;
}


---
C уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32962412
davido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
#include <iostream.h>
#include <string.h>

int main()
{
char str[]="hack";

int l=strlen(str)-1;

for(int i=0; i < l; ++i,--l)
{
str ^=str[l]^=str^=str[l];
}
cout << str << endl;
return 0;
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32962424
davido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
void main () - ne pravilno
int main( ) - odin iz pravilnix variantov
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32962456
davido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tochnee
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <iostream.h>
#include <string.h>

int main()
{
  char str[]="ha";
  
  int l=strlen(str)- 1 ;

  if (l< 1 )return  1 ;

  for (int i =  0 ; i < l; ++i, --l)
  {
    str[i] ^= str[l] ^= str[i] ^=s tr[l]; // Fishka! - bez vremennix peremennix
  }
  
  cout << str << endl;
  
  return  0 ;
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32962536
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давидо получил твою реализацию - мне понравилось! В принципе тема что то закисла - я новую сделал ! Мучайтесь!
...
Рейтинг: 0 / 0
19 сообщений из 69, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто знает самую короткую и красивую функцию переворота строки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]