Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68

ф-ция реверса строки

14.05.2013, 10:51. Показов 11075. Ответов 110
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 1й и последний символы, 2й и предпоследний и т.д.), но ф-ция должна принимать параметром указатель на char т.е. на начало строки и все. я там немного тупанул но написал, вот хочу узнать есть ли решение получше моего.
вот код (писал в Embarcadero RAD Studio (Borland)):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//ф-ция принимает указатель на массив char с символом окончания строки '\0'
//и производит реверс полученного массива
void TForm1::reverce(char *str)
{
    char* end_str = &str[0];
 
    while (*end_str != '\0') ++end_str;
    
    char  buf;
    while (end_str > str)
    {
        --end_str;
        buf      = *str;
        *str     = *end_str;
        *end_str = buf;
        ++str;  
    }
}
кто захочет проверить, выносим кнопку, лабел и эдит на форму и в ивент на клик кнопки пишем:
C++
1
2
3
4
5
AnsiString str = Edit1->Text.c_str();
 
    reverce(str.c_str());
 
    Label1->Caption = str;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2013, 10:51
Ответы с готовыми решениями:

Функция реверса строки
На собеседовании в одну компанию меня попросили на бумажке написать функцию реверса строки. Буквально парой дней раньше я услышал о том...

Написание программы реверса строки
Не могу понять в чем ошибка выдаёт (2 3 3 3 3 3 3 3 3 3) Прошу помощи в нахождении ошибки. #include "stdafx.h" #include...

Какая ф-ция в VC++ определяет длину строки???
Здравствуйте ... не могу разобраться со строками в VC++ помогите пожалуйста

110
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.05.2013, 14:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от igor001 Посмотреть сообщение
C++
1
while (--end_str > str)
на пустой строке - неопределённое поведение
сравниваемые указатели должны указывать на элементы одного массива
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 15:51  [ТС]
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void revers(char* str)
{
    string s1;
    string s2;
    string result;
    int i(0);
    for(;i<strlen(str)/2;i++)
        s1+=str[i];
    for(;i<strlen(str);i++)
        s2+=str[i];
    for(i=s2.size()-1;i>=0;i--)
        result+=s2[i];
    //cout <<"result= "<<result<<endl;
    for(i=s1.size()-1;i>=0;i--)
        result+=s1[i];
 
    strcpy(str,result.c_str());
}
}

ты хоть проверял этот код? запускал его? ты осознаешь что в нем много лишних и бесполезных действий, понимаешь что минимум один цикл и строка явно лишние??? ты понимаешь что вопрос стоял о улучшении написанной мною ф-ции а не о преобразовании мотоцикла в инвалидное кресло?
1. уже говорилось о том что нельзя использовать какие-либо ф-ции
2. зачем тебе s1?... блин да ну на... я даже не буду пытаться это разбирать.

Добавлено через 8 минут
Цитата Сообщение от accept Посмотреть сообщение
на пустой строке - неопределённое поведение
сравниваемые указатели должны указывать на элементы одного массива
вполне определенное, проверял, прога пашет, ошибок не выдает. строка или массив это последовательный контейнер, т.е. элементы в памяти размещены последовательно, при сравнении указателей, в случае пустой строки, указатель end_str указывает на область памяти перед 1м эл-том соответственно в цикл прога не заходит. хотя незнаю что будет если указатель str будет изначально указывать на 0ю область памяти... мб вылетит ошибка во время операции --end_str
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 15:54
Цитата Сообщение от igor001 Посмотреть сообщение
мб вылетит ошибка во время операции
не вылетит. вы ведь не разыменовываете указатель
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 15:58
igor001, можно Ваш код ещё ужать
C++
1
2
3
4
5
6
7
8
9
10
11
12
void reverse(char *str)
{
    char* end_str = str;
    while (*++end_str);
    
    while (--end_str > str)
    {
       register char  buf  = *str;
       *str++   = *end_str;
       *end_str = buf;
    }
}
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:00
Цитата Сообщение от Tulosba Посмотреть сообщение
while (*++end_str);
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:07  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
igor001, можно Ваш код ещё ужать
C++
1
2
3
4
5
6
7
8
9
10
11
12
void reverse(char *str)
{
    char* end_str = str;
    while (*++end_str);
    
    while (--end_str > str)
    {
       register char  buf  = *str;
       *str++   = *end_str;
       *end_str = buf;
    }
}
действительно, не думал что цикл while (*++end_str); "поймет" когда остановиться, читал Страуструпа, там было что-то подобное, только для ф-ции копирования, кажется было приблизительно так while (*out++ = *in++);
но на счет переноса обьявления переменной в цикл не соглашусь, ведь т.к. она локальная, не будет ли она после каждой итерации уничтожаться?

Добавлено через 2 минуты
Цитата Сообщение от vxg Посмотреть сообщение
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
только что проверил, вродь норм
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:12
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться
будет, но это же не объект. накладных расходов не будет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 16:13
Цитата Сообщение от vxg Посмотреть сообщение
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
давайте добавим тогда в самое начало:
C++
1
if( !*str ) return;
Только не говорите мне, что надо ещё и на 0 сам указатель проверить
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:14
Цитата Сообщение от igor001 Посмотреть сообщение
только что проверил, вродь норм
вы не правы. я собрал в билдере с включенным кодгвардом он сказал доступ к участку за пределами. в рантайме конечно это не приводит к жесткой ошибке но зачем оно надо то? фактически вы начинаете проверку со второго символа. а если там не ноль оно так и побежит...

Добавлено через 40 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
на 0
имеется ввиду не s = 0 а s = ""
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 16:15
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться?
т.к. это обычная POD-переменная на стеке - ничего злобного не случится.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:16
подставьте вот это и увидите в дебаге что первый символ который проверяет эта функция в строке 1234 будет равен 2
C++
1
2
3
4
5
    while (true)
    {
        char c = *++end_str;
        if (!c) break;
    }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 16:18
Цитата Сообщение от vxg Посмотреть сообщение
имеется ввиду не s = 0 а s = ""
Я понял. Поэтому и предложил вариант, который предложил, и сказал про нулевой указатель.
При нулевом указателе еще одно условие добавить придется:
C++
1
if( !str || !*str ) return;
1
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:19  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
т.к. это обычная POD-переменная на стеке - ничего злобного не случится.
так будет она уничтожаться после каждой итерации или нет. если да, то получается если в строке 100 символов, то 100 раз будет выделена и освобождена память для этой переменной, что не есть хорошо.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 16:21
Цитата Сообщение от igor001 Посмотреть сообщение
так будет она уничтожаться после каждой итерации или нет.
Что такое стек Вы понимаете? А что такое POD-тип? Накладных расходов не будет.
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:22
Цитата Сообщение от Tulosba Посмотреть сообщение
Поэтому и предложил вариант
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.
Цитата Сообщение от igor001 Посмотреть сообщение
то 100 раз будет выделена и освобождена память для этой переменной
она не будет выделяться так как вы это представляете. программа просто будет захватывать часть стека 100 раз. это совершенно не накладно. "захватывать" это просто слово. программа просто будет знать что в стеке лежит ваше число.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
14.05.2013, 16:24
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться?
нет она указывает на адрес ячейки которую нельзя уничтожить. Можно токо с помощью delete убить.
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:25  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.

она не будет выделяться так как вы это представляете. программа просто будет захватывать часть стека 100 раз. это совершенно не накладно. "захватывать" это просто слово. программа просто будет знать что в стеке лежит ваше число.
ясн, спс за разъяснение. получается простые типы данных типо int, char в цикле обьявлять не накладно в отличии от объектов
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
14.05.2013, 16:26
да. в некоторых случаях я и объекты не брезгую в цикл засовывать
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 16:26
Цитата Сообщение от ninja2 Посмотреть сообщение
Можно токо с помощью delete убить.
Вызывать delete для переменных на стеке нельзя.

Добавлено через 15 секунд
Цитата Сообщение от vxg Посмотреть сообщение
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.
согласен.
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
14.05.2013, 16:35
Цитата Сообщение от Tulosba Посмотреть сообщение
Вызывать delete для переменных на стеке нельзя.
А с начала стека можно?

А чо нельзя ошибка будет? Или оно половину удалит, а половину оставит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2013, 16:35

Программа реверса строки: почему на экран выводится мусор, вместо нужного текста?
Пишу программу реверса строки (меняет местами первый символ и последний, второй и предпоследний и т.д.). На экран выводится мусор, вместо...

Защита от реверса ( md5 )
Люди посоветуйте как сделать проверку по md5 файла. Всё работает, НО. Я когда считаю хэш и вставляю его в исходники, хэш уже билда сразу...

Реализация реверса массива
Первый и последний элемент массива трогать не надо. Как его толком перевернуть? По-разному пробовал уже, не хотят циферки по серединке...

Защита от реверса проекта
Подскажите, в какую сторону копать, хочу, чтобы программа не могла быть запущена в отладчике?

Ошибка в создании реверса массива
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru