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

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

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

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

14.05.2013, 10:51. Просмотров 4587. Ответов 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
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 12:48 #16
А чо тут от в этом коде длинны разные получаются?
C++
1
2
3
cout <<result.size()<<endl;//7
char* obcj=new char[result.size()];//pocto9nnui
cout <<"strlen(obcj)= "<<strlen(obcj)<<endl; exit(1);//22
igor001, Плохое да работает я б их бы послал бы нафиг, другие подберут, еще и перебирают, не нравится пошли нафиг ищите других.

igor001, Я тоже winapi не знаю, а для того чтобы устроится winapi это в первую очередь знать нада.

igor001, А я как видишь прошол, мне говорили задание на 3 часа сиди делай, а я меньше чем за час сделал, потом звонили питон предлагали учить, видно увидели шо шарю . Да я отказался у меня работа не бей лежачего и больше чем 200 долларов.

Добавлено через 2 минуты
Цитата Сообщение от igor001 Посмотреть сообщение
а твое, нинзя, решение лоховской задачи, откровенно говоря, плохое. сорь
Запомни плохих решений нет! Если работает это уже хорошее решение. Если б не работало тада да плохое. Это тебе я как Гуру С++ говорю.

Добавлено через 6 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Зачем так сложно ? Строковые объекты, циклы, лишние вычисления длины и
в конце концов возврат динамически выделенного буфера, который еще неизвестно
кто будет освобождать... Да, еще там ошибка переполнения буфера.
Я б отак бы делал и не было б проблем с буферами и всякой фигней и очень просто. Просто подстраивался под задания ТС типо функция должна принимать char*
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//fynkci9 reversa
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;
using std::strcpy;
#include <string>
using std::string;
 
 
string revers(string str)
{
    string s1;
    string s2;
    string result;
    int i(0);
    for(;i<str.size()/2;i++)
        s1+=str[i];
    for(;i<str.size();i++)
        s2+=str[i];
    for(i=s2.size()-1;i>=0;i--)
        result+=s2[i];
    //cout <<"result= "<<result<<endl;
    for(i=s1.size()-1;i>=0;i--)
        result+=s1[i];
 
    return result;
}
int main()
{
    char str[]="heldlow";
    cout <<"revers(str)= "<<revers(str)<<endl;
 
    return 0;
}
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2013, 13:14 #17
Цитата Сообщение от ninja2 Посмотреть сообщение
Если б не работало тада да плохое.
Нет. Тогда это вообще не решение, а плохое работает, но медленно медленно и/или перерасходует память.
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 13:16  [ТС] #18
работать то оно может и хорошо что работает, вопрос в том как оно работает + ты не понял задачу. лан, это походу бесполезно.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 13:43 #19
Цитата Сообщение от igor001 Посмотреть сообщение
работать то оно может и хорошо что работает, вопрос в том как оно работает + ты не понял задачу. лан, это походу бесполезно.
А я понял просто через указатель значение строки изменить без возврата новой строки отак:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//fynkci9 reversa
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;
using std::strcpy;
#include <string>
using std::string;
 
 
void revers(char* str)
{
    string s1;
    string s2;
    string result;
    int i(0);
    for(;i<strlen(str)/2;i++)
        s1+=str[i];
    for(;i<strlen(str);i++)
        s2+=str[i];
    for(i=s2.size()-1;i>=0;i--)
        result+=s2[i];
    //cout <<"result= "<<result<<endl;
    for(i=s1.size()-1;i>=0;i--)
        result+=s1[i];
 
    strcpy(str,result.c_str());
}
int main()
{
    char str[]="heldlow";
    cout <<"str= "<<str<<endl;//bez izmeneni9
    revers(str);//men9em cherez ykazatel6
    cout <<"str= "<<str<<endl;//izmenenna9
 
    return 0;
}
Мой код работоспособный как не какой другой .
0
vxg
14.05.2013, 14:04
  #20

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Мой код работоспособный как не какой другой
эпатаж засчитан

0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.05.2013, 14:47 #21
Цитата Сообщение от igor001 Посмотреть сообщение
C++
1
while (--end_str > str)
на пустой строке - неопределённое поведение
сравниваемые указатели должны указывать на элементы одного массива
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 15:51  [ТС] #22
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void revers(char* str)
{
    string s1;
    string s2;
    string result;
    int i(0);
    for(;i<strlen(str)/2;i++)
        s1+=str[i];
    for(;i<strlen(str);i++)
        s2+=str[i];
    for(i=s2.size()-1;i>=0;i--)
        result+=s2[i];
    //cout <<"result= "<<result<<endl;
    for(i=s1.size()-1;i>=0;i--)
        result+=s1[i];
 
    strcpy(str,result.c_str());
}
}

ты хоть проверял этот код? запускал его? ты осознаешь что в нем много лишних и бесполезных действий, понимаешь что минимум один цикл и строка явно лишние??? ты понимаешь что вопрос стоял о улучшении написанной мною ф-ции а не о преобразовании мотоцикла в инвалидное кресло?
1. уже говорилось о том что нельзя использовать какие-либо ф-ции
2. зачем тебе s1?... блин да ну на... я даже не буду пытаться это разбирать.

Добавлено через 8 минут
Цитата Сообщение от accept Посмотреть сообщение
на пустой строке - неопределённое поведение
сравниваемые указатели должны указывать на элементы одного массива
вполне определенное, проверял, прога пашет, ошибок не выдает. строка или массив это последовательный контейнер, т.е. элементы в памяти размещены последовательно, при сравнении указателей, в случае пустой строки, указатель end_str указывает на область памяти перед 1м эл-том соответственно в цикл прога не заходит. хотя незнаю что будет если указатель str будет изначально указывать на 0ю область памяти... мб вылетит ошибка во время операции --end_str
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
14.05.2013, 15:54 #23
Цитата Сообщение от igor001 Посмотреть сообщение
мб вылетит ошибка во время операции
не вылетит. вы ведь не разыменовываете указатель
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 15:58 #24
igor001, можно Ваш код ещё ужать
C++
1
2
3
4
5
6
7
8
9
10
11
12
void reverse(char *str)
{
    char* end_str = str;
    while (*++end_str);
    
    while (--end_str > str)
    {
       register char  buf  = *str;
       *str++   = *end_str;
       *end_str = buf;
    }
}
1
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
14.05.2013, 16:00 #25
Цитата Сообщение от Tulosba Посмотреть сообщение
while (*++end_str);
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 16:07  [ТС] #26
Цитата Сообщение от Tulosba Посмотреть сообщение
igor001, можно Ваш код ещё ужать
C++
1
2
3
4
5
6
7
8
9
10
11
12
void reverse(char *str)
{
    char* end_str = str;
    while (*++end_str);
    
    while (--end_str > str)
    {
       register char  buf  = *str;
       *str++   = *end_str;
       *end_str = buf;
    }
}
действительно, не думал что цикл while (*++end_str); "поймет" когда остановиться, читал Страуструпа, там было что-то подобное, только для ф-ции копирования, кажется было приблизительно так while (*out++ = *in++);
но на счет переноса обьявления переменной в цикл не соглашусь, ведь т.к. она локальная, не будет ли она после каждой итерации уничтожаться?

Добавлено через 2 минуты
Цитата Сообщение от vxg Посмотреть сообщение
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
только что проверил, вродь норм
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
14.05.2013, 16:12 #27
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться
будет, но это же не объект. накладных расходов не будет.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:13 #28
Цитата Сообщение от vxg Посмотреть сообщение
вот эта штука может глюкнуть на нулевой строке (выйдет за пределы и получит доступ к памяти)
давайте добавим тогда в самое начало:
C++
1
if( !*str ) return;
Только не говорите мне, что надо ещё и на 0 сам указатель проверить
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
14.05.2013, 16:14 #29
Цитата Сообщение от igor001 Посмотреть сообщение
только что проверил, вродь норм
вы не правы. я собрал в билдере с включенным кодгвардом он сказал доступ к участку за пределами. в рантайме конечно это не приводит к жесткой ошибке но зачем оно надо то? фактически вы начинаете проверку со второго символа. а если там не ноль оно так и побежит...

Добавлено через 40 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
на 0
имеется ввиду не s = 0 а s = ""
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 16:15 #30
Цитата Сообщение от igor001 Посмотреть сообщение
не будет ли она после каждой итерации уничтожаться?
т.к. это обычная POD-переменная на стеке - ничего злобного не случится.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 16:15
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
14.05.2013, 16:15
Ответ Создать тему
Опции темы

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