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

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

14.05.2013, 10:51. Показов 10973. Ответов 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,468
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,468
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,468
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,468
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,468
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,468
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,468
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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru