powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибки в функции реверса каждого слова строки
25 сообщений из 151, страница 3 из 7
Ошибки в функции реверса каждого слова строки
    #38565317
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--да я выделил мемори, но не освобождал и получилось то что надо, без
не очень стандартных функциий. То есть надо было подсказать что надо сделать
еще одну сисвольную переменную для изменненой строки, да и идти до средины слова
выявляется плохая идея при реверсе самого слова??

Код: plaintext
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.
#include <iostream>
#include <string.h>
using namespace std;

char *reverse (char *line)
{
    int n, m=0;
    int l=strlen(line);
    char* tmp;
    tmp=new char[l];


    for (int i=0; i<l+1; i++)
    {
        if ((char)line[i]==' ' || (char)line[i]=='\0')
        {
            if (i!=l) {
            tmp[i]=' ';}
            else tmp[i]='\0';
            n=i;
            int d=(n-1);
            for (int j=m; j<n; j++)
            {
                tmp[j]=line[d--];

            }
            m=n+1;
        }

    }
    return tmp;
}

int main()
{
  cout << reverse("Hello world hi russia");
  return 0;
}
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565362
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

попробуй разбивать задачу на подзадачи: поиск слов и собственно реверсирование слова, тогда код и читать проще, и находить проблему легче. разбери как работает следующий пример

Код: plaintext
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.
39.
#include <cstring>
#include <iostream>

// реверс последовательности символов, заданной полуоткрытым диапазоном [b, e)
char* reverse(char *b, char *e) {
    char* h = b;
    for(; b < --e; ++b) {
        char t = *b;
        *b = *e;
        *e = t;
    }
    return h;
}

// реверс каждого слова последовательности, слово ограничено одним или несколькими "пробелами"
char* reverse_each_word_of_sentence(char s[]) {
    char* h = s;
    while(*h) {
        // съедаем ведущие пробелы
        while( *h && isspace(*h) )
            h += 1;
        // сохраняем начало слова
        char *b = h;
        // продвигаемся по последовательности пока не встретим пробелы
        while( *h && !isspace(*h) )
            h += 1;
        // слово ограничено двумя указателями b и h, причем h не входит
        // реверс слова
        reverse(b, h);
    }
    return s;
}

int main(int argc, char *argv[])
{
    char s[] = "  \t abc \t efgh klmno  \t";
    std::cout << reverse_each_word_of_sentence(s);
    return 0;
}


вывод
Код: plaintext
1.
  	cba 	 hgfe onmlk  	
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565406
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A что значит for(; b<--e;++b) там ведь h-вводится. И что там начальное в цыкле fоr-и почему b должно быть меньше и от е точнее еще на 1 уменьшенное. Почему в двох параметрах идет речь о пре-крементах. И самое главное: что значит возвратить h он же b равен. И иак это влияет на использование в функции реверса в строке?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565417
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutИ что там начальное в цыкле fоr-и почему b должно быть меньше и от е точнее еще на 1 уменьшенное.
Потому что автор немного отступил от своего же описания
Анатолий Широковсобственно реверсирование слова
Тут reverse(char *b, char *e) переворачивает последовательность символов с пробелом (или нулем) в конце, т.е. "e" указывает не на последнюю букву слова, а на символ за ней, поэтому хитрость с "--e" нужна чтобы этот последний символ не трогать.
stutИ самое главное: что значит возвратить h он же b равен.
b меняется и в конце h != b
stutИ иак это влияет на использование в функции реверса в строке?
В данном конкретном случае никак, h тут вообще лишний. Можно тип функции сделать void и убрать char* h = b; и return h;
Такой подход классический для работы со строками чтобы удобно было комбинировать несколько функций в одном выражении. Например сравнить два перевернутых слова
Код: plaintext
1.
if(strsmp(reverse(a, b), reverse(c,d)) > 0)
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565422
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то я могу выложить свой способ :) Я написал его вчера, и не исправил его полностью, то есть там есть ещё что-то кроме указателей. Сейчас буду править

Код: plaintext
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
//Это полный реверс одной строки в Си (те она имеет '\0')
void reverse(const char* word, int lenght)//начальный байт памяти, количество байт для считывания
//(с учётом того что ещё один байт конце строки).
//тут вы можете пределать по желанию
//количество байт идёт на входе, ибо функция эта общего вида
{
	--lenght;
	while (lenght >= 0)
	{
		printf("%c", *(word + lenght));
		lenght--;
	}
}

void reverse_each_word(const char* word)//принимает указатель на начало строки
{
	int lenght = 0;
	//определил длину всей строки
	while (*(word + lenght) != '\0')
	{
		++lenght;
	}
	//то что выше можно заменить strlen, веротятно
	
	int global_cur = 0;//глобальный текущий указатель на элемент строки
	int w_cur_lenght = 0;//длина текущего слова
	int w_cur_start = 0;//указатель на текущее слово
	while (global_cur <= lenght)//иду по всей строке
	{
		if (*(word + global_cur) == ' ' || global_cur==lenght)//если пробел или конец строки
		{
			reverse(word + w_cur_start, w_cur_lenght);//вывожу реверс текущей строки
			printf(" ");//печатаю пробел, кстати тут немного неккоректно в конце, выведется лишний пробел
			w_cur_lenght = 0;//обнуляю длину текущего слова
			w_cur_start = global_cur + 1;//указатель на новое слово
		}
		else
		{
			++w_cur_lenght;//увеличиваю длину текущего слова
		}
		++global_cur;//увеличиваю глобальный индексатор
	}
}

int main()
{
	printf("\n");
	reverse_each_word("Hello world");
	printf("\n");
	return 0;
}
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565424
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_T,
а Анатолий Широков уже видимо сделал всё на указателях ..


Анатолий Широков// реверс последовательности символов, заданной полуоткрытым диапазоном [b, e)

Хороший комментарий
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565483
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНаконец-то я могу выложить свой способ :)
Ты не ту задачу решил. Близко к исходной, но не ту.
Задача стояла "функция реверса каждого слова строки", а ты сделал вывод каждого слова наоборот.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565491
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_Tфункция реверса каждого слова строки

т.е. чтобы я перезаписывал в память для этой-же строки значение её реверса?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565498
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima_Tфункция реверса каждого слова строки

т.е. чтобы я перезаписывал в память для этой-же строки значение её реверса?
да, записать реверс поверх исходного слова.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565534
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, она не возвращает значение, даже неявно не возвращает, и вчера про это думал целый день. Решил её не переделывать. Мне показалось что для данной задачи лучше читать память по другому, нежели менять значение строки.

Впрочем для самообразования напишу функцию которая делает реверс сама в себя. Но я хочу придумать другой алгоритм. Сначала таким-же, а потом другой.

Будущий алгоритм напоминает мне часы. Шестерни точнее. Я хочу вставлять эту строку в паззл и толкать её, там где будут отдельные слова, будут шестерни, я кручу строку по кругу и всё становится на свои места. И всё равно должен быть алгоритм ещё лучше.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565541
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565547
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Я не отступал от своего комментария

// реверс последовательности символов, заданной полуоткрытым диапазоном [b, e)

Где ты нашел отступление? b входит, e не входит в полуоткрытый диапазон.

stut,

Идея реверса состоит в движении двух указателей b и e на встречу друг другу, а обмен имеем смысл пока указатель на начало b меньше указателя на конец e. В силу того, что e не входит в диапазон и рассматривается как терминатор последовательности мы сначала его уменьшаем на единицы, а только потом обращаемся к содержимому.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565562
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

круто, рисуй ещё...
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНаконец-то я могу выложить свой способ :) Я написал его вчера, и не исправил его полностью, то есть там есть ещё что-то кроме указателей. Сейчас буду править

Код: plaintext
1.
2.
//Это полный реверс одной строки в Си (те она имеет '\0')
void reverse(const char* word, int lenght)//начальный байт памяти, количество байт для считывания



Когда ты придумываешь имена для функций в С++ - нужно их наполнять смыслом. Это никакой не реверс.
Это по смыслу - printReverse() или reversePrint().
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565574
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковDima T,

Я не отступал от своего комментария

// реверс последовательности символов, заданной полуоткрытым диапазоном [b, e)

Где ты нашел отступление? b входит, e не входит в полуоткрытый диапазон.
я про твою исходную постановку задачи 15586620
Анатолий Широковпопробуй разбивать задачу на подзадачи: поиск слов и собственно реверсирование слова
Как мне показалось эта небольшая нестыковка вызвала непонимание.

Комментарий полностью соответствует тому что функция делает. Тут я ничего против не писал.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565577
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Да, вроде, все понятно, слово можно задать полуоткрытым диапазоном, а можно открытым. Все равно это будет реверс слова.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565579
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryя кручу строку по кругу и всё становится на свои места
Это тебе не поможет (насколько я понял твои картины) по кругу это так
abc => bca => cab => abc

Изобретай шестерню другой системы
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565613
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще до кучи можно поднять вопрос скорости.
Раз уж мы в общем случае должны скопировать аргумент в буфер, то было бы логично вместо копирования и последующего реверса по месту делать копирование одновременно с реверсом.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565626
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryя кручу строку по кругу и всё становится на свои места
Это тебе не поможет (насколько я понял твои картины) по кругу это так
abc => bca => cab => abc

Изобретай шестерню другой системы
В перспективе - это PPM архиватор.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565779
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще я должен сказать, что вы все подходите к решению проблемы недостаточно масштабно. Нет размаха....

Как надо это делать?

Составить словарь всех слов, с их реверсами.

Выделить в тексте слова, найти по словарю и заменить на реверс.

Вещь как надо...
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565816
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Словарь? Опять Стебелёк нужен.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38565849
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и без лексера и парсера не обойтись.
А то как составить синтаксическое дерево слов?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38568292
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Анатолий Широков
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// реверс последовательности символов, заданной полуоткрытым диапазоном [b, e)
char* reverse(char *b, char *e) {
    char* h = b;
    for(; b < --e; ++b) {
        char t = *b;
        *b = *e;
        *e = t;
    }
    return h;
}



допустим:
Код: plaintext
1.
char* temp="Hello".



Я пытался сделать следующее:
Код: plaintext
1.
reverse(temp,temp+4)



Не могу понять в чём проблема. Мне кажется я что-то упустил или забыл.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38568295
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И почему-то адрес с которого начинается "Hello" всегда заканчивался 8.Хотя это может быть совпадение
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38568297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНе могу понять в чём проблема. Мне кажется я что-то упустил или забыл.
Конкретнее надо писать что именно не получается. Тут телепатов нет.

Как минимум ты неверно вызываешь reverse(), т.к. указатель конца надо не НА последний, а ЗА последний символ, т.е.
Код: plaintext
1.
reverse(temp,temp+5);
...
Рейтинг: 0 / 0
25 сообщений из 151, страница 3 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибки в функции реверса каждого слова строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]