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

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

14.05.2013, 10:51. Показов 11022. Ответов 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
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.05.2013, 12:01
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от igor001 Посмотреть сообщение
попробуй сломать
это будет сложно. я лишь фантазирую на тему "что может случиться" и озвучил свои опасения относительно декремента адреса приводящего к получению адреса больше чем исходный для случая если строка имеет нулевой размер и расположена в начале сегмента
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 12:05  [ТС]
ты не фантазируй а поставь себя на место компилятора и рассмотри все варианты которые могут возникнуть выполняя последовательно код, следуя описанной логике
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2013, 12:15
Цитата Сообщение от igor001 Посмотреть сообщение
а поставь себя на место компилятора
при разыменовании адреса, память под который не выделена (находится за пределами контейнера) - UB.
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 12:21  [ТС]
если человек создал указатель на строку, затем переместил его за пределы контейнера и пульнул в ф-цию, тут уже вряд-ли что-то можно сделать

Добавлено через 2 минуты
тогда ф-ция покрамсает данные, лежащие в памяти и вообще много вариантов развития событий)
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:28
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];
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2013, 12:35
Цитата Сообщение от programina Посмотреть сообщение
const char *str = "text";
при таком раскладе в str вообще писать нельзя.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:39
Цитата Сообщение от 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 ] ;
}
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.05.2013, 12:42
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 ] ;
}
Так, ок.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 12:44
Цитата Сообщение от 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
блин, почему нет компилятора с++ для телефона
0
15.05.2013, 12:47

Не по теме:

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

1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.05.2013, 12:52
Цитата Сообщение от igor001 Посмотреть сообщение
ты не фантазируй а поставь себя на место компилятора и рассмотри все варианты которые могут возникнуть выполняя последовательно код, следуя описанной логике
именно эти варианты я и озвучиваю если строка пуста и находится в начале сегмента код убьет машину
0
15.05.2013, 12:53

Не по теме:

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

Не по теме:


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

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

0
15.05.2013, 12:58

Не по теме:

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

1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 13:02
Tulosba, ура, на ideone.com все работает. Спасибо!
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:19  [ТС]
C++
1
char* x = "qwerty";
Добавлено через 4 минуты
Цитата Сообщение от vxg Посмотреть сообщение
именно эти варианты я и озвучиваю если строка пуста и находится в начале сегмента код убьет машину
да епт как? опиши действия машины последовательно?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.05.2013, 13:20
igor001,
C++
1
char* x = "qwerty";
Warning - каст от const char[7] к char*.
Потенциальное UB в дальнейшем.
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:25  [ТС]
в твоем представлении

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

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

Добавлено через 1 минуту
а все, понял undefined behaviour
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.05.2013, 13:27
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 - потому что никто не запрещает случайно попытаться поменять некий символ в этом литерале.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.05.2013, 13:30
Цитата Сообщение от ForEveR Посмотреть сообщение
Потенциальное UB в дальнейшем
*задумчиво чешет голову* всю жизнь спокойно присваивал указателю значение заключенное в кавычки при инициализации... не, ну я конечно согласен что если я потом буду скакать по этой строке и выйду за ее пределы я могу упасть или они про что то другое пишут (типа что там может быть не C строка а какой нибудь юинкод шлак) /к сожалению в этом случае моего английского оказалось недостаточно для понимания нюансов/
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:34  [ТС]
не знаю, я сам так не писал в своем коде)) (юзаю строки или вектор) но сча попробовал, вродь норм работает.
я только не понимаю зачем дальше тему развивать, задача решена уже.
У меня единственный вопрос остался. Мне тут товарищи говорят мол все делают через временную переменную а через битовые операции это "плохой стиль" + процессор вычисляет такие операции медленнее чем если бы использовалась временная переменная...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2013, 13:34

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru