8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
|
|||||||||||
1 | |||||||||||
ф-ция реверса строки14.05.2013, 10:51. Показов 8700. Ответов 110
Метки нет (Все метки)
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 1й и последний символы, 2й и предпоследний и т.д.), но ф-ция должна принимать параметром указатель на char т.е. на начало строки и все. я там немного тупанул но написал, вот хочу узнать есть ли решение получше моего.
вот код (писал в Embarcadero RAD Studio (Borland)):
0
|
14.05.2013, 10:51 | |
Ответы с готовыми решениями:
110
Функция реверса строки Написание программы реверса строки Какая ф-ция в VC++ определяет длину строки??? Программа реверса строки: почему на экран выводится мусор, вместо нужного текста? |
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
15.05.2013, 13:34 | 81 |
-указатель str смотрит на начало сегмента
-по адресу на который смотрит указатель лежит ноль (терминатор, строка пустая) -мы пытаемся вычислить длину - цикл подсчета не запускается ни разу потому как мы сразу видим что по адресу на который смотрит end_str лежит ноль - end_str остается указывающим на начало строки -мы входим в условие цикла перестановки и делаем декремент перед сравнением -end_str понижается ниже сегмента и система присваивает ему значение соответствующее верху сегмента -условие выполняется end_str > str и мы входим в цикл -мы переставляем ВСЕ содержимое сегмента до тех пор пока не дойдем до второго от начала строки символа - в этом случае условие --end_str > str не выполнится так как обратиться в равенство и мы выйдем из цикла (если машина к тому времени будет жива)
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.05.2013, 13:36 | 82 |
vxg, Все, что между " " является строковым литералом. Его тип (говорим сейчас об обычных символах и без конкатенации строк) является const char[n], где n - кол-во символов + '\0' ("qwerty" имеет тип const char[7]), расположенном в статической памяти программы (литерал существует все время работы программы). Если мы присваиваем его адрес к char* - мы имеем полное право менять символы, на которые указывает данный char*, однако если мы попытаемся изменить строковый литерал (НАСТОЯЩУЮ константу) - мы получим UB. Если мы сразу присвоим к const char*, при попытке изменения нас пошлет компилятор и мы не будем ловить клевые ошибки, если мы сразу присвоим к массиву (сделаем КОПИЮ строкового литерала) - мы можем его менять как хотим.
0
|
15.05.2013, 13:36 | 83 |
вот так работает
C++ #include <iostream> #include <cstdio> #include <string> using namespace std ; int main () { string str ("text" ) ; string buf = str ; int len = str. size () ; for (int i = 0 ; i < len ; i ++ ) { str [ i ] = buf [ len - 1 - i ] ; } cout << str << endl ; }
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.05.2013, 13:39 | 84 |
programina, Конечно, ведь при создании строки происходит копия char* переданного в конструктор.
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
15.05.2013, 13:39 | 86 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.05.2013, 13:41 | 88 |
vxg, impl-defined.
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
||||||
15.05.2013, 13:48 | 89 | |||||
типа данные могут храниться в части файла программы отображенной в память только для чтения? в шоке... а почему они вообще разрешают в таком случае это присвоение?? я то по наивности в каком-то проекте делал что то вроде
0
|
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
|
|
15.05.2013, 13:48 [ТС] | 90 |
мы не входим ни в один цикл т.к. в 1м цикле по указателю не символ а литеральный ноль, во 2м - указатели равны
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|||||||||||
15.05.2013, 13:55 | 91 | ||||||||||
о... нашел. скрипт проекта для WinCC
Добавлено через 4 минуты
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.05.2013, 14:02 | 93 |
vxg, Самый что ни на есть UB в С++. Он даже не потенциальный.
1
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
15.05.2013, 14:06 | 95 |
ох... век живи век учись
нет. там система так построена что поступающие в функцию имена гарантированно не могут выйти за пределы предполагаемого размера.
0
|
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
|
|
15.05.2013, 14:14 [ТС] | 96 |
указывает, и что? мы ведь в цикл не войдем, указатель нигде далее не используется, хотя конечно конструкция опасная, согласен
Добавлено через 6 минут хотя она опасная лишь в том случае, если после сдвига указателя на конец строки он по памяти перейдет за указатель на начало строки
0
|
16.05.2013, 19:02 | 97 |
ВООООООООООООТ ))))))))))))))))
C++ #include <iostream> #include <string.h> using namespace std; char *reverse(char *s) { int l = strlen(s); char b[l]; for(int i=0; i < l; i++) b[i] = s[i]; for(int i=0; i < l; i++) s[i] = b[l-1-i]; return s; } int main() { char s[] = "abcdefghijklmnopqrstuvwxyz"; cout << reverse(s) << endl; }
0
|
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
|
|
16.05.2013, 19:41 | 99 |
10 страниц комментариев вокруг обычно реверса )) Я конечно еще кибер-титьку посасываю, но это по моему просто катастрофа )) Тут решений кушай не хочу, можно даже свой стринг написать таким образом, что сложность реверса будет O(1), а отличаться от обычного он будет разве, что названием и архитектурой, можно темплейт привязать, тогда крути-верти, что хочешь и так далее.
0
|
16.05.2013, 19:42 | 100 |
Это все можно оставить, главное что работает, а вот с русскими буквами не работает
0
|
16.05.2013, 19:42 | |
16.05.2013, 19:42 | |
Помогаю со студенческими работами здесь
100
Защита от реверса ( md5 ) Реализация реверса массива Защита от реверса проекта Ошибка в создании реверса массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |