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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
14.05.2013, 10:51     ф-ция реверса строки #1
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 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++ Операторная ф-ция
C++ Глобальная ф-ция getline
C++ Какая ф-ция в VC++ определяет длину строки???
C++ ф-ция с throw
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
16.05.2013, 20:03     ф-ция реверса строки #101
Поучаствую)
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2639 / 1650 / 156
Регистрация: 13.01.2012
Сообщений: 6,212
17.05.2013, 09:30     ф-ция реверса строки #102
Цитата Сообщение от gray_fox Посмотреть сообщение
Поучаствую)
обращаю и ваше внимание на то что если str указывает на начало сегмента и строка пустая вы войдете в цикл перестановки по причине префиксного декримента при проверке условия и изговняете целиком весь сегмент
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
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;
}
vxg
Модератор
 Аватар для vxg
2639 / 1650 / 156
Регистрация: 13.01.2012
Сообщений: 6,212
17.05.2013, 10:18     ф-ция реверса строки #104
Цитата Сообщение от gray_fox Посмотреть сообщение
так
вместо сравнений с нулем можно было бы просто использовать само выражение в качестве условия
C++
1
2
3
4
5
   assert(str);
 
   if (*str) {
      char * last = str;
      while (*++last); ...
gray_fox
17.05.2013, 10:27
  #105

Не по теме:

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

vxg
17.05.2013, 10:32
  #106

Не по теме:

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

gray_fox
17.05.2013, 10:34
  #107

Не по теме:

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

Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
17.05.2013, 10:48     ф-ция реверса строки #108
Цитата Сообщение от vxg Посмотреть сообщение
так никто не делает. это признак того что человек не знает языка
Полная запись условий - это своего рода страховка.
Если однажды в условии встретится класс с перегруженным "operator bool", - а такое
частенько делается, чтобы можно было возвращать объекты из функций с сохранением
семантики проверки ошибок, - условие выполнялось бы также, как и раньше.
Так что между "никто не делает" и "незнание языка" корреляции нет.
vxg
Модератор
 Аватар для vxg
2639 / 1650 / 156
Регистрация: 13.01.2012
Сообщений: 6,212
17.05.2013, 11:05     ф-ция реверса строки #109
Цитата Сообщение от Убежденный Посмотреть сообщение
Если однажды в условии встретится класс с перегруженным "operator bool"
вы здесь такое видите? char * является описанным вами типом? нет? тогда к чему этот сферический конь в вакууме?
Цитата Сообщение от Убежденный Посмотреть сообщение
Так что между "никто не делает" и "незнание языка" корреляции нет
согласен. однако все буквари которые я читал приводили проверки вида
C++
1
2
int x;
if (x == 0) ...
в качестве примера графомании и детского сада
Tulosba
17.05.2013, 11:26
  #110

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2013, 14:12     ф-ция реверса строки
Еще ссылки по теме:

C++ ф-ция
C++ Рандомная ф-ция rand()
C++ Параметризованная ф-ция класса

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

Или воспользуйтесь поиском по форуму:
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
17.05.2013, 14:12     ф-ция реверса строки #111
Друзья, прекращаем оффтопить.
Yandex
Объявления
17.05.2013, 14:12     ф-ция реверса строки
Ответ Создать тему
Опции темы

Текущее время: 09:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru