powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто знает самую короткую и красивую функцию переворота строки?
69 сообщений из 69, показаны все 3 страниц
Кто знает самую короткую и красивую функцию переворота строки?
    #32917463
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть char *a = "hack"; получить "kcah"! Самое главное элегантно!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917468
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может и не элегантно, но вроде коротко. Для затравки я думаю, пойдет.
Самый очевидный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <iostream.h>

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

  for(int i= 0 ;i<len/ 2 ;i++)
  {
    char t=str[i];
    str[i]=str[len-i- 1 ];
    str[len-i- 1 ]=t;
  }
  cout<<str<<endl;
}
Если длина строки нечетная, ничего страшного, средний символ все равно никуда не перемещается.
P.S. А вообще идея хорошая, в свое время в журнале "ZX-Ревю" был такой раздел, назывался "Этюды", где люди предлагали самые эффективные способы выполнения каких-либо действий.

---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917473
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот именно на эту тему и хотел удочку закинуть! Хочешь еще задачку на элегантное решение? Есть такая функция atoi ! Сделай то же самое сам ! Условия теже!!!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917474
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сначала решил вот так: (зацыни! )

void Reverse(char *src, char *dst)
{
for(int i = strlen(src)-1, a = 0; i >= 0; i--, a++)
{
dst[a] = src ;
}
}

Аргументы по ссылке! Но здесь входной и выходной массив! А, потом я пришел почти к тому же что и ты! Тренировать мозги иногда полезно! Так что насчет atoi?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917476
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри - вот так!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Reverse(char *src, char *dst)
{    
	for(int i = strlen(src)- 1 , a =  0 ; i >=  0 ; i--, a++)
	{	    
	dst[a] = src[i];
	}
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917492
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую. Подожди пару дней, сегодня работы много.
---
Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917495
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int atoi(char *a)
{
 char c = *a++;
 char sign = c;
 if (c == '-' || c == '+')
  c = *a++;
 int total =  0 ;
 while (c>='0' && c<='9' )
 {
   total =  10  * total + c;
   c = *a++;
  }
 if (sign == '-') return -total;
  else return total;
}
не мое.
это я мелкомягкие исходники поставляемые с dotnet студией перекоцал.
там у них поддержка многопоточности была добавлена, 64 битовых целых и юникода вроде.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917496
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, не успел.
---
Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917499
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, попробую! Если от мелкомягких то - это либо индийцы либо китайцы навояли! Посмотрим!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917500
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dubrov! Почему не успел! Успел успел! Давай свою идею ... все равно интересно!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917553
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне лень думать


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917567
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эллегантно так эллегантно:

Код: plaintext
1.
2.
3.
4.
5.
int main(int argc, char *argv[])
{
    char* str = "hack";
    reverse_copy(str, str + strlen(str), ostream_iterator<char>(cout));
    return EXIT_SUCCESS;
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917594
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
8-)
Код: plaintext
1.
2.
3.
4.
std::string str("blabla");
//reverse order
str.rbegin();
std::copy( str.rbegin(), str.rend(), inserter( s, s.begin() ) );
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917599
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
упс, звиняйте. копировать надо в другую строку 8-))). Если это копирование нужно.
Код: plaintext
1.
2.
3.
char *old = "test";
std::string str( old ); // need strlen?
std::string rev( str.rbegin(), str.rend() );
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917603
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
а можно написать и при помощи swap. Только надо ли?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917607
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
вобчем главная идея - используйте STL, и жить станет проще
Код: plaintext
1.
2.
3.
4.
5.
char *old = "test";
std::string str( "new" ); // need strlen?

std::reverse( str.begin(), str.end() );
if( old ) std::reverse( old, old+strlen(old)- 1  ); //overflow danger, check size
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917704
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergLetСорри - вот так!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Reverse(char *src, char *dst)
{    
	for(int i = strlen(src)- 1 , a =  0 ; i >=  0 ; i--, a++)
	{	    
	dst[a] = src[i];
	}
}

А так пойдет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>

void rev( char *s) {
 char *p=s;
 char c;
 if (!s) return;
 while (*p) p++; p--;  //p=s+strlen(s)-1
 while(p>s) {
  c=*p;  *p--=*s;  *s++=c;
 }
}

main() {

 char s[]="hackperehack";

 printf("before: %s\n",s);
 rev(s);
 printf("after: %s\n",s);

}

Просто у вас с Дубровым, на мой, конечно, скромный взгляд, как то по паскалевски получилось А C он на то и C, чтоб сторонних наблюдателей как можно сильнее запутать
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917809
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вспоминается один шуточный тест который
я нашел в дебрях FIDO-net.

Задание: дана переменная x. Написать программу
на любом языке программирования которая проверяет
если x=3 то записывает в x число 2. И наоборот.

По результатам теста составляется портрет программиста:
его характер, склонности к математике, оптимизации,
парадигмам искусственного интеллекта.

Проверьте себя, коллеги. :)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917830
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <stdio.h>
#include <stdlib.h>
int main(int argn, char** argc)
{
 if (argn< 2 )return  0 ;
 int x=atoi(argc[ 1 ]);
 x^= 1 ;
 printf("%i\n",x);
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917865
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто! Способность к оптимизации на низком уроване!!

А еще у кого есть варианты?

Смелее!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917903
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это наверное в "программирование" надо такие темы поднимать.
тут не много представителей других языков шатается :-)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917931
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самый классный вариант - сделать ассемблерную вставку push...push до нуля, заодно определяем длину. А потом делаем pop...pop...
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917945
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стековые операции - не самые эффективные, насколько я помню.
хотя на спектруме такой подход рулил
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917968
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКруто! Способность к оптимизации на низком уроване!!

А еще у кого есть варианты?

Смелее!

Круто, но слишком понятно Поэтому несколько переделаю код alex_k-я
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void main(int argc, char **argv) {
 int x;
 if (argc< 2 ) return;
 x=atoi(argv[ 1 ]);
 (x== 3 ) ? (x= 2 ) : ( (x== 2 ) ? (x= 3 ) : (x) );
 printf("%i\n",x);
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917969
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kстековые операции - не самые эффективные, насколько я помню.
хотя на спектруме такой подход рулил
некоторые переменные можно сделать register, и пожалуй это будет самый быстродействующий способ
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917991
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
v6y maytonКруто! Способность к оптимизации на низком уроване!!

А еще у кого есть варианты?

Смелее!

Круто, но слишком понятно Поэтому несколько переделаю код alex_k-я
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void main(int argc, char **argv) {
 int x;
 if (argc< 2 ) return;
 x=atoi(argv[ 1 ]);
 (x== 3 ) ? (x= 2 ) : ( (x== 2 ) ? (x= 3 ) : (x) );
 printf("%i\n",x);
}



Код: plaintext
1.
2.
3.
int convert(int x)
{
    return ( x >  0  && ( (x >>  1 ) & 0x1 ) ) ? x ^ 0x1 : x;
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32917993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно рассмотреть концепцию интерфейса перевернутой строки. То есть переопределить строковые операции для обратных строк.

Пример кода на "псевдо-языке":

Код: plaintext
1.
2.
3.
string s1="Hack";
IRevstring s2=(IRevsting)s1;
out << s2;

Выигрываем на времени выполнения. И получаем благодарность от жителей стран Востока которые пишут справа налево.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918008
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВыигрываем на времени выполнения. И получаем благодарность от жителей стран Востока которые пишут справа налево.

О , как
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 FishingGod

Молодец!

Бонус за функциональный подход!
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918023
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeart maytonВыигрываем на времени выполнения. И получаем благодарность от жителей стран Востока которые пишут справа налево.

О , как

Что как? Выигрываем? Или получаем благодарность?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918045
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно рассмотреть концепцию интерфейса перевернутой строки. То есть переопределить строковые операции для обратных строк.

Пример кода на "псевдо-языке":

Код: plaintext
1.
2.
3.
string s1="Hack";
IRevstring s2=(IRevsting)s1;
out << s2;

Выигрываем на времени выполнения. И получаем благодарность от жителей стран Востока которые пишут справа налево.

А каким образом выигрываем на времени выполнения?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обьясняю популярно. Строка НЕ ПЕРЕВОРАЧИВАЕТСЯ. Изменяются методы ввода-вывода строки на консоль и строковые операции.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918167
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОбьясняю популярно. Строка НЕ ПЕРЕВОРАЧИВАЕТСЯ. Изменяются методы ввода-вывода строки на консоль и строковые операции.
Ну тогда для доступа к отдельным частям строки все равно придется применять некие арифметические операции: типа str[j] должно вернуть str[len-j-1] (j=0,len-1) и т.д. Может тогда проще один раз перевернуть и не париться? Или я опять вашу идею недопонял
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918440
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6y maytonОбьясняю популярно. Строка НЕ ПЕРЕВОРАЧИВАЕТСЯ. Изменяются методы ввода-вывода строки на консоль и строковые операции.
Ну тогда для доступа к отдельным частям строки все равно придется применять некие арифметические операции: типа str[j] должно вернуть str[len-j-1] (j=0,len-1) и т.д. Может тогда проще один раз перевернуть и не париться? Или я опять вашу идею недопонял

Вы все верно поняли. Но все зависит от конечных целей вашей разработки.

К примеру .. если вы умножаете две матрицы (class Matrix), то по правилам математики, строка первой матрицы должна умножатся на столбец другой. Но для этого нам не нужно переворачивать вторую. Мы можем определить интерфейс ITransposeMatrix для класса Matrix где операция [i,j] будет возвращать то что требуется без перестановок в оперативной памяти. Сравнивая затраты на операцию [] и физическую реорганизацию элементов в двумерном массиве, я могу сказать что первое - предпочтительнее.

Я привел слишком простой пример. Чтобы почувствовать вкус программирования с использованием интерфейсов надо создать нечто большее.

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

С уважением
Mayton
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918508
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergLetЕсть char *a = "hack"; получить "kcah"! Самое главное элегантно!

А если взять из StrUtils функцию ReverseString("hack");

C++Builder 6

Note: This method does not work with multibyte character sets.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918568
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonК примеру .. если вы умножаете две матрицы ...едпочтительнее
спасибо, было оч интересно увидеть красивое решение проблемы, к-рую как-то решал сам =)
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918784
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dwlвобчем главная идея - используйте STL, и жить станет проще
Код: plaintext
1.
2.
3.
4.
5.
char *old = "test";
std::string str( "new" ); // need strlen?

std::reverse( str.begin(), str.end() );
if( old ) std::reverse( old, old+strlen(old)- [b]1 [/b] ); //overflow danger, check size


Зачем отнимать 1? Все стандартные алгоритмы принимают полуоткрытые интервалы, так что правильно так:

Код: plaintext
std::reverse( old, old+strlen(old)); 
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32918814
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и чтобы было совсем правильно, переменная old должна быть объявлена как показано ниже, так как объевление переменной old как char *old = "1234" скрывает неявный const и программа просто не скомпилируется:
Код: plaintext
1.
2.
char old[] = "1234";
std::reverse( old, old+strlen(old)); 
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32919614
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут поделились интересным кодом .
его содержимое говорит само за себя, любопытная штука.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32920071
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня atoi почти как у alex_k, потому и написал что не успел.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int my_atoi(const char *str)
{
  int sign= 1 ,n= 0 ;
  char c;

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

  while(c=*str++,isdigit(c))n=n* 10 +c-'0';

  return sign*n;
}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32920091
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2зёма
а чего, если первый символ равен '-' то тогда не надо делать str++?
или он сделается, а как я не догоняю?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32920196
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k2зёма
а чего, если первый символ равен '-' то тогда не надо делать str++?
или он сделается, а как я не догоняю?

Ты видишь, что break-ов в switch-e нет? Вот в этом вся идея. То есть + или -, str++ выполнится в любом случае.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32920212
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не умею swith ем пользоваться :-)
как-то не прижилось после паскалевково case слишком навороченно както :-)
надо разбираться конечно...
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922138
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Ты видишь, что break-ов в switch-e нет? Вот в этом вся идея. То есть + или -, str++ выполнится в любом случае.

Совершенно верно.
А вообще, switch в C мне намного больше нравится чем case в Паскале.
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922165
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dwlвобчем главная идея - используйте STL, и жить станет проще
Код: plaintext
1.
2.
3.
4.
5.
char *old = "test";
std::string str( "new" ); // need strlen?

std::reverse( str.begin(), str.end() );
if( old ) std::reverse( old, old+strlen(old)- 1  ); //overflow danger, check size

Задача стояла - написать ф-цию переворота строки, а не использовать что-то написаное кем-то. (Просьба не обижаться, это просто константация факта, а не наезд).
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922202
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
Кто знает самую короткую и красивую функцию переворота строки?
    #32922222
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё короче:

Код: plaintext
1.
char str[MAX_PATH]="back", *s=str, *p=s+strlen(str)- 1 ;
while(p>s){ *s++=(*p--=(*s=*s^*p)^*p)^*s;}
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922304
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
DubrovУ меня atoi почти как у alex_k, потому и написал что не успел.
не учитывает граничные значения интов и ошибку переполнения.

насчет "переворота"
Код: plaintext
1.
2.
3.
4.
5.
void str_reverse(char* Begin, char* End)
{	
	for (; Begin < End; ++Begin)
		std::iter_swap(Begin, --End);
}
Устроит?
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922337
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dwl
не учитывает граничные значения интов и ошибку переполнения.

В книге Р.Жешке "Толковый словарь языка C" в описании функции atoi написано:
... если результат превосходит MAX_INT, происходит ошибка ввода-вывода ... результат функции не определен. Так что как я понимаю отслеживание таких глюков должен производить программист использующий функцию, а не ее (функции) разрабочик. Как поведет себя следующая конструкция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>

void input(char *str)
{
  scanf("%s",str);
}

void main(void)
{
  char login[ 10 ];
  input(login)
}
если я введу стоку длиной 74 символа?
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #32922343
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ввобще, давайте перенесем это обсуждение из "C++" в "Программирование", интересно как эту задачу решат люди сидящие на других языках. Просто я не знаю как это сделать, с кем договариваться (с модератором, наверное?).
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Кто знает самую короткую и красивую функцию переворота строки?
    #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
69 сообщений из 69, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто знает самую короткую и красивую функцию переворота строки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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