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

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

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

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

14.05.2013, 10:51. Просмотров 4299. Ответов 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(что-то) { тело_ф-ции } Что дает такая запись с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15237 / 6869 / 1088
Регистрация: 02.05.2013
Сообщений: 11,246
Завершенные тесты: 1
14.05.2013, 11:34     ф-ция реверса строки #2
А если в строке UTF-8 ?
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 11:42  [ТС]     ф-ция реверса строки #3
Цитата Сообщение от Убежденный Посмотреть сообщение
А если в строке UTF-8 ?
незнаю, нубик я еще, сделал как смог)

Добавлено через 4 минуты
просто я вот через дебагер смотрел и когда я в 1й строке ф-ции созданному указателью присваиваю указатель на переданную в ф-цию строку то вижу что оба указателя видят строку полностью, а не один символ, как я предполагал, но в то же время узнать длинну строки я не могу, и судя по увиденному через дебаг передавая указатель ф-ция, каким-то образом, принимает и данные о кол-ве символов в строке и что это за символы. Интересно, можно ли как-то выковырять эти данные не передавая их в ф-цию явно.
vxg
Модератор
3115 / 1917 / 207
Регистрация: 13.01.2012
Сообщений: 7,331
14.05.2013, 11:51     ф-ция реверса строки #4
Цитата Сообщение от igor001 Посмотреть сообщение
каким-то образом, принимает
нет. дебагер просто идет по куску памяти до нулевого символа и показывает содержимое в виде текста

Добавлено через 1 минуту
а вообще я бы пару моментов убрал но это не принципиально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void TForm1::reverce(char *str)
{
    char* end_str = str;
 
    while (*end_str) end_str++;
    
    char  buf;
    while (end_str > str)
    {
        end_str--;
        buf      = *str;
        *str     = *end_str;
        *end_str = buf;
        str++;  
    }
}
Убежденный
Системный программист
Эксперт С++
15237 / 6869 / 1088
Регистрация: 02.05.2013
Сообщений: 11,246
Завершенные тесты: 1
14.05.2013, 11:56     ф-ция реверса строки #5
igor001, у Вас в цикле один лишний проход.
Например, перевернуть "abc": сначала "a" поменяется местами с "c", а затем "b" с "b".
И потом, разве обязательно делать функцию частью формы ?
По-моему, предполагается, что это функция C++, которая может быть использована
где угодно - хоть в Builder, хоть в GCC, хоть в Clang, независимо от среды.

Добавлено через 34 секунды
Цитата Сообщение от igor001 Посмотреть сообщение
reverce
Пишется reverse.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 11:56     ф-ция реверса строки #6
Писать такие задания под GUI билдера вообще довольно сомнительно.
Я бы сделал как-то так (если не заморачиваться про кодировки):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstring>
 
void reverse( char* s )
{
    const int len = strlen( s );
    
    for( int i=0; i<len/2; ++i )
    {
        std::swap( s[i], s[len-1-i] );
    }
}
 
int main() {
 
    char s[] = "Some_string2";
    std::cout << s << std::endl;
    reverse( s );
    std::cout << s << std::endl;
 
    return 0;
}
Или вообще так :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cstring>
#include <algorithm>
 
int main() {
 
    char s[] = "Some_string2";
    std::cout << s << std::endl;
    std::reverse( s, s+strlen(s) );
    std::cout << s << std::endl;
 
    return 0;
 
}
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 12:03     ф-ция реверса строки #7
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
//fynkci9 reversa
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;
#include <string>
using std::string;
 
 
string 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];
 
    return result;
}
int main()
{
    char str[]="heldlow";
    cout <<"revers(str)= "<<revers(str)<<endl;
 
    return 0;
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 12:04     ф-ция реверса строки #8
P.S.
Цитата Сообщение от igor001 Посмотреть сообщение
C++
1
2
AnsiString str = Edit1->Text.c_str();
reverce(str.c_str());
Давно уже в быдлере ничего не делал, но не уверен, что изменение строки AnsiString через c_str() валидно.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 12:07     ф-ция реверса строки #9
Господа почему то когда я пытаюсь из функции вернуть 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
//fynkci9 reversa
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;
#include <string>
using std::string;
 
 
char* 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];
    cout <<"(char*)result.c_str()= "<<(char*)result.c_str()<<endl;
    return (char*)result.c_str();
}
int main()
{
    char str[]="heldlow";
    cout <<"revers(str)= "<<revers(str)<<endl;
 
    return 0;
}
Убежденный
Системный программист
Эксперт С++
15237 / 6869 / 1088
Регистрация: 02.05.2013
Сообщений: 11,246
Завершенные тесты: 1
14.05.2013, 12:09     ф-ция реверса строки #10
Цитата Сообщение от ninja2 Посмотреть сообщение
Господа почему то когда я пытаюсь из функции вернуть char* у меня крякозябры получаются, а если из самой функции вывожу, то вроде все нормально передается, в чом ошибка?
Потому что возвращается указатель на временный объект.
Функция завершилась, объект удален. А указатель на него остался.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2013, 12:09     ф-ция реверса строки #11
Цитата Сообщение от ninja2 Посмотреть сообщение
Господа почему то когда я пытаюсь из функции вернуть char* у меня крякозябры получаются
Потому что возвращаете указатель (через c_str) на локальный объект. Который уничтожится при выходе из функции.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 12:17     ф-ция реверса строки #12
А ну да, ну да отак все нормально:
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
//fynkci9 reversa
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;
using std::strcpy;
#include <string>
using std::string;
 
 
char* 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];
    char* obcj=new char[strlen(str)];//pocto9nnui
    strcpy(obcj,result.c_str());
    return obcj;
}
int main()
{
    char str[]="heldlow";
    cout <<"revers(str)= "<<revers(str)<<endl;
 
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Потому что возвращаете указатель (через c_str) на локальный объект. Который уничтожится при выходе из функции.
Ну видишь так тоже как я выше сделал указатель на локальный объект вернулся но он не уничтожился, хотя new создает глобальные объекты скорее всего.
Убежденный
Системный программист
Эксперт С++
15237 / 6869 / 1088
Регистрация: 02.05.2013
Сообщений: 11,246
Завершенные тесты: 1
14.05.2013, 12:19     ф-ция реверса строки #13
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* 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];
 char* obcj=new char[strlen(str)];//pocto9nnui
 strcpy(obcj,result.c_str());
 return obcj;
}
Зачем так сложно ? Строковые объекты, циклы, лишние вычисления длины и
в конце концов возврат динамически выделенного буфера, который еще неизвестно
кто будет освобождать... Да, еще там ошибка переполнения буфера.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.05.2013, 12:28     ф-ция реверса строки #14
igor001, Ну как прошол собеседование? Я кодато тоже проходил токо по С там задания простенькие были, там мне после него предложили питон учить со стипендией в 200 долларов, я тогда отказался мб зря, наверно заметили, что я шото шарю от и предложили, если б по С++, то я б согласился не раздумывая, а так питон с нуля начинать, хоть и не бесплатно ну его нафиг. Это одно было собеседование простенькое, а так сразу задания присылали тоже простые, но там оконные приложения нужно было делать, а я не шарю как, хотя задания простые очень были.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Зачем так сложно ? Строковые объекты, циклы, лишние вычисления длины и
в конце концов возврат динамически выделенного буфера, который еще неизвестно
кто будет освобождать... Да, еще там ошибка переполнения буфера.
Наоборот мне так проще. Да можно string просто принимать и возвращать string.

Добавлено через 1 минуту
А что за переполнение буфера? вродеж длинны кургом совпадают c_str возвращает строку с нулем, а динна str равна новой строке.

Добавлено через 59 секунд
Ну да тут нужно плюс 1 добавить char* obcj=new char[strlen(str)]; чтобы 8 символов было
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 12:31  [ТС]     ф-ция реверса строки #15
действительно, лишняя итерация и строка, так лучше будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TForm1::reverce(char *str)
{
    char* end_str = &str[0];
 
    while (*end_str != '\0') ++end_str;
    
    register char  buf;
    while (--end_str > str)
    {
        buf      = *str;
        *str     = *end_str;
        *end_str = buf;
        ++str;  
    }
}
собеседование не прошел, сказали для них у меня знаний не хватает еще, сказали что WinAPI нужно знать еще и практики поболее, ЗЫ пользоваться сторонними ф-циями нельзя было, а твое, нинзя, решение лоховской задачи, откровенно говоря, плохое. сорь
ninja2
230 / 186 / 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;
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2013, 13:14     ф-ция реверса строки #17
Цитата Сообщение от ninja2 Посмотреть сообщение
Если б не работало тада да плохое.
Нет. Тогда это вообще не решение, а плохое работает, но медленно медленно и/или перерасходует память.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 13:16  [ТС]     ф-ция реверса строки #18
работать то оно может и хорошо что работает, вопрос в том как оно работает + ты не понял задачу. лан, это походу бесполезно.
ninja2
230 / 186 / 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;
}
Мой код работоспособный как не какой другой .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 14:04     ф-ция реверса строки
Еще ссылки по теме:

Операторная ф-ция - C++
Добрый вечер, вот есть код: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;vector&gt; #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) по этому цикл выполняется всего один раз. Как это исправить? Проверял код в...


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

Или воспользуйтесь поиском по форуму:
vxg
14.05.2013, 14:04     ф-ция реверса строки
  #20

Не по теме:

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

Yandex
Объявления
14.05.2013, 14:04     ф-ция реверса строки
Ответ Создать тему
Опции темы

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