powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление пробелов в конце строки
23 сообщений из 23, страница 1 из 1
удаление пробелов в конце строки
    #39159322
Ребята, здравствуйте,

Подскажите, пожалуйста, как написать функцию (на С/С++), которая обрезает пробелы в конце переданной ей строки.
Функция должна быть написана в расчёте на работу с очень длинными строками с очень большим количеством пробелов,
оптимизирована по количеству обращений к памяти. Сигнатура: void TrimRight( char *s )



И мне не очень понятно, что значит "функция должна быть оптимизирована по количеству обращений к памяти".

Буду очень признательна за помощь.

Заранее спасибо,

Марина
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159329
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марина ЕгинаИ мне не очень понятно, что значит "функция должна быть оптимизирована
по количеству обращений к памяти".
Это значит не заменять каждый конечный пробел на '\0'.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159350
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марина ЕгинаПодскажите, пожалуйста, как написать функцию (на С/С++), которая обрезает пробелы в конце переданной ей строки. Заводишь два указателя.
Первым проходишь всю строку от начала до конца. Каждый раз как нашла пробел, ставишь на него второй указатель. Если после этого у тебя в первом указателе нашелся не-пробел - обнуляешь второй. Когда первый дошел до конца строки смотришь, если второй указатель нулевой - значит строка не имеет конечных пробелов. Если нулевой - все что после второго это пробелы. Обрезаешь по второму указателю и все.
Обращений к памяти - длина строки плюс один.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159357
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то один препод фабрикует подобные задания

http://www.programmersforum.ru/showthread.php?t=186971
http://www.cyberforum.ru/csharp-beginners/thread443502.html
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159409
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,


можно проще, бежать с конца по строке и искать первый не пробел.
правда, два подхода по строке придется делать - для поиска конца и обратный.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159590
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite Owl,


можно проще, бежать с конца по строке и искать первый не пробел.
правда, два подхода по строке придется делать - для поиска конца и обратный.Проще, но больше обращений к памяти.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159594
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКакой-то один препод фабрикует подобные задания

http://www.programmersforum.ru/showthread.php?t=186971
http://www.cyberforum.ru/csharp-beginners/thread443502.html
Только тупые студенты вместо форума по С/С++ постят в C#.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159613
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фишинг. Я регулярно читаю новостные ленты в ВК. Несколько интересных стримов
по технологиям, железу e.t.c.

И в каждом треде 3-5 студентиков флудящих одним и тем-же месседжем. Типа
Ааааа..... срочно помогите решить! Сесия на носу! Подробности в личку!
Причем конструктивного диалога с ним нету. К этому времени рыба уже
клюнула в одной из соц-сетей...

Вобщем модерирование в этом ВК вообще нулевое. Уровень флуда зашкаливает.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159624
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Шо такое ВК?
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159695
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВК это vk.com
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159730
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
правда, два подхода по строке придется делать - для поиска конца и обратный.зачем 2? strlen же есть? о_о Но обратно, да, бежать придётся.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159735
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbзачем 2? strlen же есть? о_о Но обратно, да, бежать придётся.
strlen() как конец строки находит?
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159749
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

сначала я подумал, что при выделении памяти размер хранится по смещению от указателя. Потом я понял, что 3 раза протупил и пошёл посмотреть в strlen и ужаснулся.
Ну, т.е. во-первых, массив текста может быть статический на стеке, во-вторых размер динамически выделенной памяти не есть длина строки, в-третьих, указатель может быть со смещением.
я написал такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
		char szData[32] = "abc";
		size_t i = strlen(szData);
		char* psz = new char[24];
		strcpy(psz, "abc");
		i = strlen(psz);
		char* psz2 = psz+1;
		i = strlen(psz2);
		delete[] psz;



Внутри strlen какая-то получёрная магия, там есть беганье по всей строке в поисках конца (если это подразумевалось в вопросе), но оно хитрое, там обрабатываются данные по 4 байта сразу. Ну и магия в main_loop-е.

Если кто не знает, как посмотреть, то вот код strlen:

strlen
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop

str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned

        add     eax,dword ptr 0         ; 5 byte nop to align label below
        align   16                      ; should be redundant

main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop

        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0

        test    ah,ah                   ; is it byte 1
        je      short byte_1

        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2

        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set

byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret


...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159758
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbВнутри strlen какая-то получёрная магия, там есть беганье по всей строке в поисках конца (если это подразумевалось в вопросе), но оно хитрое, там обрабатываются данные по 4 байта сразу. Ну и магия в main_loop-е.
Это не магия, а результат оптимизации. Читать память по 4 байта быстрее чем по одному.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159783
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Магия не в чтении, магия в main_loop-е :)
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159814
Фотография Shifu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марина Егина,

Я бы так нарисовал....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
char* TrimRight(const char* src)
{
	// При работе с огромными строками, полагаю выделить на результат 100 символов или 1 млн символов не получится. Нужно знать
	// сколько символов будет результат. А это означает, что придется делать 2 прохода все равно.
	// Конечно же если мы не хотим вносить изменения в аргументирующую строку.
	//     1й на то, что бы узнать длину строки.
	//     2й копирование.
	int len = strlen(src) - 1;
	while (len >= 0 && src[len] == ' ')
		len--; // Ищем первый непробел
	char* res = new char[++ ++ len];
	res[len] = '\0';
	memcpy(res, src, len);
	return res;
}
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159815
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shifu,

Белый Сов только что дал алгоритм (правильный) однопроходного решения задачи.
А ты говоришь -- "нельзя"...
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159820
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shifu,

К тому же, задача стоит

"написать функцию (на С/С++), которая обрезает пробелы в конце переданной ей строки."
Сигнатура:
Код: plaintext
1.
void TrimRight( char *s );



Т.е. подразумевается усечение переданной строки, в её же памяти, а не создание новой строки.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159823
Фотография Shifu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Ключевой момент здесь написать функцию! (const char* src)
Если мы изменим аргумент и его вышлем результатом, то за один проход можно это сделать, спору нет. А если мы в функции объявляем аргумент с CONST. Это означает???
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159824
Фотография Shifu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Ну ок. Значит я неправильно понял условие. Тем более... с такими объемами, хочешь не хочешь выделять память в этой функции пришлось, что нагружает программиста следить за освобождением...
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159834
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShifuMasterZiv,

Ключевой момент здесь написать функцию! (const char* src)
Если мы изменим аргумент и его вышлем результатом, то за один проход можно это сделать, спору нет. А если мы в функции объявляем аргумент с CONST. Это означает???
Может внимательно задание почитать?
Марина ЕгинаСигнатура: void TrimRight( char *s )
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39159951
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShifuMasterZiv,

Ну ок. Значит я неправильно понял условие. Тем более... с такими объемами, хочешь не хочешь выделять память в этой функции пришлось, что нагружает программиста следить за освобождением...


как раз совсем не нужно ничего выделять.
...
Рейтинг: 0 / 0
удаление пробелов в конце строки
    #39188464
beholder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TCHAR *TrimLeft( TCHAR *str)
{
    TCHAR *first_space = str, *last_space = str;
    while( *last_space )
    {
        first_space = last_space;
        while( *first_space && !isspace(*first_space) ) ++first_space;
        last_space = first_space;
        while( *last_space && isspace(*last_space)) ++last_space;
    }
    *first_space = L'\0';
    return str;
}


Видимо требуется что-то в этом роде. Он строго однопроходный и линейный относительно
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление пробелов в конце строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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