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

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

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

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

14.05.2013, 10:51. Просмотров 4588. Ответов 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
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.05.2013, 13:20 #76
igor001,
C++
1
char* x = "qwerty";
Warning - каст от const char[7] к char*.
Потенциальное UB в дальнейшем.
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:25  [ТС] #77
в твоем представлении

Добавлено через 2 минуты
незнаю, билдер хавает и преобразует в строку, добавляя терминальный ноль в конце

Добавлено через 15 секунд
ЗЫ что такое UB?

Добавлено через 1 минуту
а все, понял undefined behaviour
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.05.2013, 13:27 #78
igor001, И что дальше?
new.cpp:3:14: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
char* c = "qwerty";
Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow
string literal has type “array of n const char”, where n is the size of the string as defined below, and has
static storage duration (3.7).
Потенциальное UB - потому что никто не запрещает случайно попытаться поменять некий символ в этом литерале.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
15.05.2013, 13:30 #79
Цитата Сообщение от ForEveR Посмотреть сообщение
Потенциальное UB в дальнейшем
*задумчиво чешет голову* всю жизнь спокойно присваивал указателю значение заключенное в кавычки при инициализации... не, ну я конечно согласен что если я потом буду скакать по этой строке и выйду за ее пределы я могу упасть или они про что то другое пишут (типа что там может быть не C строка а какой нибудь юинкод шлак) /к сожалению в этом случае моего английского оказалось недостаточно для понимания нюансов/
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:34  [ТС] #80
не знаю, я сам так не писал в своем коде)) (юзаю строки или вектор) но сча попробовал, вродь норм работает.
я только не понимаю зачем дальше тему развивать, задача решена уже.
У меня единственный вопрос остался. Мне тут товарищи говорят мол все делают через временную переменную а через битовые операции это "плохой стиль" + процессор вычисляет такие операции медленнее чем если бы использовалась временная переменная...
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
15.05.2013, 13:34 #81
Цитата Сообщение от igor001 Посмотреть сообщение
да епт как? опиши действия машины последовательно?
-указатель str смотрит на начало сегмента
-по адресу на который смотрит указатель лежит ноль (терминатор, строка пустая)
-мы пытаемся вычислить длину - цикл подсчета не запускается ни разу потому как мы сразу видим что по адресу на который смотрит end_str лежит ноль - end_str остается указывающим на начало строки
-мы входим в условие цикла перестановки и делаем декремент перед сравнением
-end_str понижается ниже сегмента и система присваивает ему значение соответствующее верху сегмента
-условие выполняется end_str > str и мы входим в цикл
-мы переставляем ВСЕ содержимое сегмента до тех пор пока не дойдем до второго от начала строки символа - в этом случае условие --end_str > str не выполнится так как обратиться в равенство и мы выйдем из цикла (если машина к тому времени будет жива)
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.05.2013, 13:36 #82
vxg, Все, что между " " является строковым литералом. Его тип (говорим сейчас об обычных символах и без конкатенации строк) является const char[n], где n - кол-во символов + '\0' ("qwerty" имеет тип const char[7]), расположенном в статической памяти программы (литерал существует все время работы программы). Если мы присваиваем его адрес к char* - мы имеем полное право менять символы, на которые указывает данный char*, однако если мы попытаемся изменить строковый литерал (НАСТОЯЩУЮ константу) - мы получим UB. Если мы сразу присвоим к const char*, при попытке изменения нас пошлет компилятор и мы не будем ловить клевые ошибки, если мы сразу присвоим к массиву (сделаем КОПИЮ строкового литерала) - мы можем его менять как хотим.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.05.2013, 13:36 #83
вот так работает
C++
#include <iostream>
#include <cstdio>
#include <string>
using namespace std ;
int main ()
{
string str ("text" ) ;
string buf = str ;
int len = str. size () ;
for (int i = 0 ; i < len ; i ++ )
{
    str [ i ] = buf [ len - 1 - i ] ;
}
cout << str << endl ;
}
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.05.2013, 13:39 #84
programina, Конечно, ведь при создании строки происходит копия char* переданного в конструктор.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.05.2013, 13:39 #85
Цитата Сообщение от vxg Посмотреть сообщение
всю жизнь спокойно присваивал указателю значение заключенное в кавычки при инициализации
Инициализация - пожалуйста. Изменять такую строку нельзя.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
15.05.2013, 13:39 #86
Цитата Сообщение от ForEveR Посмотреть сообщение
мы получим UB
задам тупой вопрос - почему? "qwerty" лежит в блоке недоступном для записи?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.05.2013, 13:41 #87
Цитата Сообщение от vxg Посмотреть сообщение
"qwerty" лежит в блоке недоступном для записи?
В том числе может быть и такое. Зависит от реализации.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.05.2013, 13:41 #88
vxg, impl-defined.
Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation-
defined. The effect of attempting to modify a string literal is undefined.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
15.05.2013, 13:48 #89
Цитата Сообщение от ForEveR Посмотреть сообщение
Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation-
defined. The effect of attempting to modify a string literal is undefined.
типа данные могут храниться в части файла программы отображенной в память только для чтения? в шоке... а почему они вообще разрешают в таком случае это присвоение?? я то по наивности в каком-то проекте делал что то вроде
C++
1
char *s = "YYYY MM DD HH mm ss";
специально резервируя тем самым область для впечатывания на место "хлама" реальных значений (выводил в s).... *рвет на себе волосы*
0
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
15.05.2013, 13:48  [ТС] #90
Цитата Сообщение от vxg Посмотреть сообщение
-указатель str смотрит на начало сегмента
-по адресу на который смотрит указатель лежит ноль (терминатор, строка пустая)
-мы пытаемся вычислить длину - цикл подсчета не запускается ни разу потому как мы сразу видим что по адресу на который смотрит end_str лежит ноль - end_str остается указывающим на начало строки
-мы входим в условие цикла перестановки и делаем декремент перед сравнением
-end_str понижается ниже сегмента и система присваивает ему значение соответствующее верху сегмента
-условие выполняется end_str > str и мы входим в цикл
-мы переставляем ВСЕ содержимое сегмента до тех пор пока не дойдем до второго от начала строки символа - в этом случае условие --end_str > str не выполнится так как обратиться в равенство и мы выйдем из цикла (если машина к тому времени будет жива)
мы не входим ни в один цикл т.к. в 1м цикле по указателю не символ а литеральный ноль, во 2м - указатели равны
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 13:48
Привет! Вот еще темы с ответами:

Операторная ф-ция - 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) по этому цикл выполняется всего один раз. Как это исправить? Проверял код в...


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

Или воспользуйтесь поиском по форуму:
90
Yandex
Объявления
15.05.2013, 13:48
Ответ Создать тему
Опции темы

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