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

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

14.05.2013, 10:51. Показов 11954. Ответов 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,476
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,476
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,476
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
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru