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

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

14.05.2013, 10:51. Показов 8701. Ответов 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
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
16.05.2013, 20:03 101
Author24 — интернет-сервис помощи студентам
Поучаствую)
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
#include <iostream>
#include <cassert>
 
 
char *reverse(char * const str) {
   assert(str != 0);
 
   char * last = str;
   for ( ; *last != '\0'; ++last);
 
   for (char * first = str; first < --last; ++first) {
      char const tmp = *first;
      *first = *last;
      *last = tmp;
   }
        
   return str;
}
 
 
int main() {
   char empty[] = "";
   char one[]   = "a";
   char two[]   = "ab";
   char three[] = "abc";
   char many[]  = "abcdefghijklmnopqrstuvwxyz";
   
   std::cout << reverse(empty) << std::endl;
   std::cout << reverse(one)   << std::endl;
   std::cout << reverse(two)   << std::endl;
   std::cout << reverse(three) << std::endl;
   std::cout << reverse(many)  << std::endl;
}
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2013, 09:30 102
Цитата Сообщение от gray_fox Посмотреть сообщение
Поучаствую)
обращаю и ваше внимание на то что если str указывает на начало сегмента и строка пустая вы войдете в цикл перестановки по причине префиксного декримента при проверке условия и изговняете целиком весь сегмент
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
17.05.2013, 09:51 103
Ок. Попробуем так.
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
#include <iostream>
#include <cassert>
 
 
char *reverse(char * const str) {
   assert(str != 0);
 
   if (*str != '\0') {
      char * last = str;
      while (*++last != '\0');
 
      for (char * first = str; first < --last; ++first) {
         char const tmp = *first;
         *first = *last;
         *last = tmp;
      }
   }
        
   return str;
}
 
 
int main() {
   char empty[] = "";
   char one[]   = "a";
   char two[]   = "ab";
   char three[] = "abc";
   char many[]  = "abcdefghijklmnopqrstuvwxyz";
   
   std::cout << reverse(empty) << std::endl;
   std::cout << reverse(one)   << std::endl;
   std::cout << reverse(two)   << std::endl;
   std::cout << reverse(three) << std::endl;
   std::cout << reverse(many)  << std::endl;
}
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2013, 10:18 104
Цитата Сообщение от gray_fox Посмотреть сообщение
так
вместо сравнений с нулем можно было бы просто использовать само выражение в качестве условия
C++
1
2
3
4
5
   assert(str);
 
   if (*str) {
      char * last = str;
      while (*++last); ...
0
gray_fox
17.05.2013, 10:27
  #105

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
вместо сравнений с нулем можно было бы просто использовать само выражение в качестве условия
Мне явное указание больше по нраву.

0
vxg
17.05.2013, 10:32
  #106

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Мне явное указание больше по нраву.
так никто не делает. это признак того что человек не знает языка

0
gray_fox
17.05.2013, 10:34
  #107

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
так никто не делает.
Я так делаю)
Цитата Сообщение от vxg Посмотреть сообщение
это признак того что человек не знает языка
Странный признак) Но ваше дело, да и я не профи.

0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2013, 10:48 108
Цитата Сообщение от vxg Посмотреть сообщение
так никто не делает. это признак того что человек не знает языка
Полная запись условий - это своего рода страховка.
Если однажды в условии встретится класс с перегруженным "operator bool", - а такое
частенько делается, чтобы можно было возвращать объекты из функций с сохранением
семантики проверки ошибок, - условие выполнялось бы также, как и раньше.
Так что между "никто не делает" и "незнание языка" корреляции нет.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2013, 11:05 109
Цитата Сообщение от Убежденный Посмотреть сообщение
Если однажды в условии встретится класс с перегруженным "operator bool"
вы здесь такое видите? char * является описанным вами типом? нет? тогда к чему этот сферический конь в вакууме?
Цитата Сообщение от Убежденный Посмотреть сообщение
Так что между "никто не делает" и "незнание языка" корреляции нет
согласен. однако все буквари которые я читал приводили проверки вида
C++
1
2
int x;
if (x == 0) ...
в качестве примера графомании и детского сада
0
Tulosba
17.05.2013, 11:26
  #110

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
if (x == 0) ...
А тут еще можно поговорить и про йода-кондишн:
C++
1
if (0 == x) ...

0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
17.05.2013, 14:12 111
Друзья, прекращаем оффтопить.
0
17.05.2013, 14:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2013, 14:12
Помогаю со студенческими работами здесь

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

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

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

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


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

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