Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 10:51     ф-ция реверса строки #1
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 10:51     ф-ция реверса строки
Посмотрите здесь:

Функция реверса строки C++
C++ Операторная ф-ция
C++ Глобальная ф-ция getline
C++ Какая ф-ция в VC++ определяет длину строки???
C++ ф-ция с throw
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
15.05.2013, 12:01     ф-ция реверса строки #61
Цитата Сообщение от igor001 Посмотреть сообщение
попробуй сломать
это будет сложно. я лишь фантазирую на тему "что может случиться" и озвучил свои опасения относительно декремента адреса приводящего к получению адреса больше чем исходный для случая если строка имеет нулевой размер и расположена в начале сегмента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 12:05  [ТС]     ф-ция реверса строки #62
ты не фантазируй а поставь себя на место компилятора и рассмотри все варианты которые могут возникнуть выполняя последовательно код, следуя описанной логике
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2013, 12:15     ф-ция реверса строки #63
Цитата Сообщение от igor001 Посмотреть сообщение
а поставь себя на место компилятора
при разыменовании адреса, память под который не выделена (находится за пределами контейнера) - UB.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 12:21  [ТС]     ф-ция реверса строки #64
если человек создал указатель на строку, затем переместил его за пределы контейнера и пульнул в ф-цию, тут уже вряд-ли что-то можно сделать

Добавлено через 2 минуты
тогда ф-ция покрамсает данные, лежащие в памяти и вообще много вариантов развития событий)
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:28     ф-ция реверса строки #65
C++
const char *str = "text";
const char *buf = str;
int len = strlen(str);
 
for (int i = len; i > 0; i--)
{
    str[i] = buf[len-i];
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2013, 12:35     ф-ция реверса строки #66
Цитата Сообщение от programina Посмотреть сообщение
const char *str = "text";
при таком раскладе в str вообще писать нельзя.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:39     ф-ция реверса строки #67
Цитата Сообщение от Tulosba Посмотреть сообщение
при таком раскладе в str вообще писать нельзя.
Так?
C++
char * str = "text" ;
char * buf = str ;
int len = strlen (str ) ;
for (int i = len ; i > 0 ; i -- )
{
    str [ i] = buf [ len -i ] ;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.05.2013, 12:42     ф-ция реверса строки #68
programina, Аналогично, писать можно с точки зрения компиляции, с точки зрения выполнения - ловите UB.
C++
1
2
3
4
5
6
7
char str[] = "text" ;
char * buf = str ;
int len = strlen (str ) ;
for (int i = len ; i > 0 ; i -- )
{
    str [ i] = buf [ len -i ] ;
}
Так, ок.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:44     ф-ция реверса строки #69
Цитата Сообщение от ForEveR Посмотреть сообщение
programina, Аналогично, писать можно с точки зрения компиляции, с точки зрения выполнения - ловите UB.
C++
1
2
3
4
5
6
7
char str[] = "text" ;
char * buf = str ;
int len = strlen (str ) ;
for (int i = len ; i > 0 ; i -- )
{
    str [ i] = buf [ len -i ] ;
}
Так, ок.
undefined behavior
блин, почему нет компилятора с++ для телефона
Tulosba
15.05.2013, 12:47
  #70

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
блин, почему нет компилятора с++ для телефона
есть же онлайн компиляторы : ideone.com liveworkspace.org

vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
15.05.2013, 12:52     ф-ция реверса строки #71
Цитата Сообщение от igor001 Посмотреть сообщение
ты не фантазируй а поставь себя на место компилятора и рассмотри все варианты которые могут возникнуть выполняя последовательно код, следуя описанной логике
именно эти варианты я и озвучиваю если строка пуста и находится в начале сегмента код убьет машину
programina
15.05.2013, 12:53
  #72

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение

Не по теме:


есть же онлайн компиляторы : ideone.com liveworkspace.org

нет, с телефона там вообще нереально, я уже пробовала

vxg
15.05.2013, 12:58
  #73

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
нет, с телефона там вообще нереально
codepad.org ?

programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 13:02     ф-ция реверса строки #74
Tulosba, ура, на ideone.com все работает. Спасибо!
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:19  [ТС]     ф-ция реверса строки #75
C++
1
char* x = "qwerty";
Добавлено через 4 минуты
Цитата Сообщение от vxg Посмотреть сообщение
именно эти варианты я и озвучиваю если строка пуста и находится в начале сегмента код убьет машину
да епт как? опиши действия машины последовательно?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.05.2013, 13:20     ф-ция реверса строки #76
igor001,
C++
1
char* x = "qwerty";
Warning - каст от const char[7] к char*.
Потенциальное UB в дальнейшем.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:25  [ТС]     ф-ция реверса строки #77
в твоем представлении

Добавлено через 2 минуты
незнаю, билдер хавает и преобразует в строку, добавляя терминальный ноль в конце

Добавлено через 15 секунд
ЗЫ что такое UB?

Добавлено через 1 минуту
а все, понял undefined behaviour
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.05.2013, 13:27     ф-ция реверса строки #78
igor001, И что дальше?
new.cpp:3:14: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
char* c = "qwerty";
Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow
string literal has type “array of n const char”, where n is the size of the string as defined below, and has
static storage duration (3.7).
Потенциальное UB - потому что никто не запрещает случайно попытаться поменять некий символ в этом литерале.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
15.05.2013, 13:30     ф-ция реверса строки #79
Цитата Сообщение от ForEveR Посмотреть сообщение
Потенциальное UB в дальнейшем
*задумчиво чешет голову* всю жизнь спокойно присваивал указателю значение заключенное в кавычки при инициализации... не, ну я конечно согласен что если я потом буду скакать по этой строке и выйду за ее пределы я могу упасть или они про что то другое пишут (типа что там может быть не C строка а какой нибудь юинкод шлак) /к сожалению в этом случае моего английского оказалось недостаточно для понимания нюансов/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 13:34     ф-ция реверса строки
Еще ссылки по теме:

C++ ф-ция
C++ Рандомная ф-ция rand()
C++ Параметризованная ф-ция класса

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

Или воспользуйтесь поиском по форуму:
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:34  [ТС]     ф-ция реверса строки #80
не знаю, я сам так не писал в своем коде)) (юзаю строки или вектор) но сча попробовал, вродь норм работает.
я только не понимаю зачем дальше тему развивать, задача решена уже.
У меня единственный вопрос остался. Мне тут товарищи говорят мол все делают через временную переменную а через битовые операции это "плохой стиль" + процессор вычисляет такие операции медленнее чем если бы использовалась временная переменная...
Yandex
Объявления
15.05.2013, 13:34     ф-ция реверса строки
Ответ Создать тему
Опции темы

Текущее время: 23:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru