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

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

14.05.2013, 10:51. Показов 8702. Ответов 110
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2013, 10:51
Ответы с готовыми решениями:

Функция реверса строки
На собеседовании в одну компанию меня попросили на бумажке написать функцию реверса строки. ...

Написание программы реверса строки
Не могу понять в чем ошибка выдаёт (2 3 3 3 3 3 3 3 3 3) Прошу помощи в нахождении ошибки. ...

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

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

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

Добавлено через 4 минуты
просто я вот через дебагер смотрел и когда я в 1й строке ф-ции созданному указателью присваиваю указатель на переданную в ф-цию строку то вижу что оба указателя видят строку полностью, а не один символ, как я предполагал, но в то же время узнать длинну строки я не могу, и судя по увиденному через дебаг передавая указатель ф-ция, каким-то образом, принимает и данные о кол-ве символов в строке и что это за символы. Интересно, можно ли как-то выковырять эти данные не передавая их в ф-цию явно.
0
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
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++;  
    }
}
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 11:56 5
igor001, у Вас в цикле один лишний проход.
Например, перевернуть "abc": сначала "a" поменяется местами с "c", а затем "b" с "b".
И потом, разве обязательно делать функцию частью формы ?
По-моему, предполагается, что это функция C++, которая может быть использована
где угодно - хоть в Builder, хоть в GCC, хоть в Clang, независимо от среды.

Добавлено через 34 секунды
Цитата Сообщение от igor001 Посмотреть сообщение
reverce
Пишется reverse.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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;
 
}
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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() валидно.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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;
}
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 12:09 10
Цитата Сообщение от ninja2 Посмотреть сообщение
Господа почему то когда я пытаюсь из функции вернуть char* у меня крякозябры получаются, а если из самой функции вывожу, то вроде все нормально передается, в чом ошибка?
Потому что возвращается указатель на временный объект.
Функция завершилась, объект удален. А указатель на него остался.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2013, 12:09 11
Цитата Сообщение от ninja2 Посмотреть сообщение
Господа почему то когда я пытаюсь из функции вернуть char* у меня крякозябры получаются
Потому что возвращаете указатель (через c_str) на локальный объект. Который уничтожится при выходе из функции.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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 создает глобальные объекты скорее всего.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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;
}
Зачем так сложно ? Строковые объекты, циклы, лишние вычисления длины и
в конце концов возврат динамически выделенного буфера, который еще неизвестно
кто будет освобождать... Да, еще там ошибка переполнения буфера.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
14.05.2013, 12:28 14
igor001, Ну как прошол собеседование? Я кодато тоже проходил токо по С там задания простенькие были, там мне после него предложили питон учить со стипендией в 200 долларов, я тогда отказался мб зря, наверно заметили, что я шото шарю от и предложили, если б по С++, то я б согласился не раздумывая, а так питон с нуля начинать, хоть и не бесплатно ну его нафиг. Это одно было собеседование простенькое, а так сразу задания присылали тоже простые, но там оконные приложения нужно было делать, а я не шарю как, хотя задания простые очень были.

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

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

Добавлено через 59 секунд
Ну да тут нужно плюс 1 добавить char* obcj=new char[strlen(str)]; чтобы 8 символов было
0
8 / 3 / 2
Регистрация: 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 нужно знать еще и практики поболее, ЗЫ пользоваться сторонними ф-циями нельзя было, а твое, нинзя, решение лоховской задачи, откровенно говоря, плохое. сорь
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.05.2013, 13:14 17
Цитата Сообщение от ninja2 Посмотреть сообщение
Если б не работало тада да плохое.
Нет. Тогда это вообще не решение, а плохое работает, но медленно медленно и/или перерасходует память.
0
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 13:16  [ТС] 18
работать то оно может и хорошо что работает, вопрос в том как оно работает + ты не понял задачу. лан, это походу бесполезно.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2013, 14:04

Защита от реверса ( md5 )
Люди посоветуйте как сделать проверку по md5 файла. Всё работает, НО. Я когда считаю хэш и вставляю...

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

Защита от реверса проекта
Подскажите, в какую сторону копать, хочу, чтобы программа не могла быть запущена в отладчике?

Ошибка в создании реверса массива
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru