Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.05.2013, 10:51. Просмотров 4739. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 10:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ф-ция реверса строки (C++):

Функция реверса строки - 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. Проверка делимости на конкретное число должна быть реализована...

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

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

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

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

А чо нельзя ошибка будет? Или оно половину удалит, а половину оставит?
delete и delete[], на сколько я знаю вызывается только для указателей (delete[] - для указателей на массивы)
0
Tulosba
:)
Эксперт С++
4619 / 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;
}
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.05.2013, 16:57 #43
Tulosba, Я бы сказал, что это UB, а будет-ли это ошибкой выполнения (или форматированием жесткого диска) зависит от реализации
0
Tulosba
14.05.2013, 17:09
  #44

Не по теме:

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

0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
14.05.2013, 17:19 #45
Цитата Сообщение от ForEveR Посмотреть сообщение
Я бы сказал, что это UB, а будет-ли это ошибкой выполнения (или форматированием жесткого диска)
А диск то здесь при чём? В худшем случае порча инфы в памяти.
0
14.05.2013, 17:19
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...

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

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

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


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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