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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
#1

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

14.05.2013, 10:51. Просмотров 4442. Ответов 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 10:51     ф-ция реверса строки
Посмотрите здесь:

Функция реверса строки - C++
На собеседовании в одну компанию меня попросили на бумажке написать функцию реверса строки. Буквально парой дней раньше я услышал о том...

Написание программы реверса строки - C++
Не могу понять в чем ошибка выдаёт (2 3 3 3 3 3 3 3 3 3) Прошу помощи в нахождении ошибки. #include "stdafx.h" #include <stdio.h> ...

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

Какая ф-ция в VC++ определяет длину строки??? - C++
Здравствуйте ... не могу разобраться со строками в VC++ помогите пожалуйста

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

ф-ция - C++
Написать программу, проверяющую делимость целого числа на числа от 2 до 10. Проверка делимости на конкретное число должна быть реализована...

ф-ция с throw - C++
Встретил такую мне незнакомую запись: тип имя_функции( параметры ) throw(что-то) { тело_ф-ции } Что дает такая запись с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
14.05.2013, 16:16     ф-ция реверса строки #31
подставьте вот это и увидите в дебаге что первый символ который проверяет эта функция в строке 1234 будет равен 2
C++
1
2
3
4
5
    while (true)
    {
        char c = *++end_str;
        if (!c) break;
    }
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:18     ф-ция реверса строки #32
Цитата Сообщение от vxg Посмотреть сообщение
имеется ввиду не s = 0 а s = ""
Я понял. Поэтому и предложил вариант, который предложил, и сказал про нулевой указатель.
При нулевом указателе еще одно условие добавить придется:
C++
1
if( !str || !*str ) return;
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:19  [ТС]     ф-ция реверса строки #33
Цитата Сообщение от Tulosba Посмотреть сообщение
т.к. это обычная POD-переменная на стеке - ничего злобного не случится.
так будет она уничтожаться после каждой итерации или нет. если да, то получается если в строке 100 символов, то 100 раз будет выделена и освобождена память для этой переменной, что не есть хорошо.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:21     ф-ция реверса строки #34
Цитата Сообщение от igor001 Посмотреть сообщение
так будет она уничтожаться после каждой итерации или нет.
Что такое стек Вы понимаете? А что такое POD-тип? Накладных расходов не будет.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
14.05.2013, 16:22     ф-ция реверса строки #35
Цитата Сообщение от Tulosba Посмотреть сообщение
Поэтому и предложил вариант
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.
Цитата Сообщение от igor001 Посмотреть сообщение
то 100 раз будет выделена и освобождена память для этой переменной
она не будет выделяться так как вы это представляете. программа просто будет захватывать часть стека 100 раз. это совершенно не накладно. "захватывать" это просто слово. программа просто будет знать что в стеке лежит ваше число.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 16:24     ф-ция реверса строки #36
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться?
нет она указывает на адрес ячейки которую нельзя уничтожить. Можно токо с помощью delete убить.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:25  [ТС]     ф-ция реверса строки #37
Цитата Сообщение от vxg Посмотреть сообщение
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.

она не будет выделяться так как вы это представляете. программа просто будет захватывать часть стека 100 раз. это совершенно не накладно. "захватывать" это просто слово. программа просто будет знать что в стеке лежит ваше число.
ясн, спс за разъяснение. получается простые типы данных типо int, char в цикле обьявлять не накладно в отличии от объектов
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
14.05.2013, 16:26     ф-ция реверса строки #38
да. в некоторых случаях я и объекты не брезгую в цикл засовывать
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:26     ф-ция реверса строки #39
Цитата Сообщение от ninja2 Посмотреть сообщение
Можно токо с помощью delete убить.
Вызывать delete для переменных на стеке нельзя.

Добавлено через 15 секунд
Цитата Сообщение от vxg Посмотреть сообщение
на мой взгляд проверять со второго символа все равно как-то противоестественно если можно сделать одну из ваших проверок просто частью штатного цикла.
согласен.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 16:35     ф-ция реверса строки #40
Цитата Сообщение от Tulosba Посмотреть сообщение
Вызывать delete для переменных на стеке нельзя.
А с начала стека можно?

А чо нельзя ошибка будет? Или оно половину удалит, а половину оставит?
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:38  [ТС]     ф-ция реверса строки #41
Цитата Сообщение от ninja2 Посмотреть сообщение
А с начала стека можно?

А чо нельзя ошибка будет? Или оно половину удалит, а половину оставит?
delete и delete[], на сколько я знаю вызывается только для указателей (delete[] - для указателей на массивы)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:55     ф-ция реверса строки #42
Цитата Сообщение от igor001 Посмотреть сообщение
только для указателей
на объект в динамической памяти (куче). Например так делать нельзя:
C++
1
2
3
4
5
int main() {
   int i;
   delete &i; // ошибка выполнения
   return 0;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.05.2013, 16:57     ф-ция реверса строки #43
Tulosba, Я бы сказал, что это UB, а будет-ли это ошибкой выполнения (или форматированием жесткого диска) зависит от реализации
Tulosba
14.05.2013, 17:09
  #44

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Я бы сказал, что это UB, а будет-ли это ошибкой выполнения (или форматированием жесткого диска) зависит от реализации
Мне повезло. У меня просто ошибка выполнения

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 17:19     ф-ция реверса строки
Еще ссылки по теме:

Операторная ф-ция - C++
Добрый вечер, вот есть код: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <vector> #include...

Глобальная ф-ция getline - C++
Всем добрый вечер :) Вообщем есть кусок кода: // read for name vector while (std::getline(std::cin, name)) { ...

Рандомная ф-ция rand() - C++
Всем привет,объясните пожалуйста как работает рандомная ф-ция,например: rand()%10 == 5 rand()%15+2 rand()%5 == 1 rand()%5 ...

Параметризованная ф-ция класса - C++
Пытаюсь заменить списки (используя структуры) на списки используя параметризованную функцию класса Компилятор ругается на строчку где я...

ф-ция getche() не выполняется - C++
В MVS 2015 не выполняется ф-ция getche() (в коде строка 52) по этому цикл выполняется всего один раз. Как это исправить? Проверял код в...


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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2013, 17:19     ф-ция реверса строки #45
Цитата Сообщение от ForEveR Посмотреть сообщение
Я бы сказал, что это UB, а будет-ли это ошибкой выполнения (или форматированием жесткого диска)
А диск то здесь при чём? В худшем случае порча инфы в памяти.
Yandex
Объявления
14.05.2013, 17:19     ф-ция реверса строки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru