Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление пробелов в конце строки / 23 сообщений из 23, страница 1 из 1
30.01.2016, 22:37
    #39159322
удаление пробелов в конце строки
Ребята, здравствуйте,

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



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

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

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

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

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


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


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

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

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

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

Шо такое ВК?
...
Рейтинг: 0 / 0
01.02.2016, 01:18
    #39159695
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
ВК это vk.com
...
Рейтинг: 0 / 0
01.02.2016, 06:41
    #39159730
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
White Owl,
правда, два подхода по строке придется делать - для поиска конца и обратный.зачем 2? strlen же есть? о_о Но обратно, да, бежать придётся.
...
Рейтинг: 0 / 0
01.02.2016, 06:53
    #39159735
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
CEMbзачем 2? strlen же есть? о_о Но обратно, да, бежать придётся.
strlen() как конец строки находит?
...
Рейтинг: 0 / 0
01.02.2016, 07:57
    #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
01.02.2016, 08:18
    #39159758
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
CEMbВнутри strlen какая-то получёрная магия, там есть беганье по всей строке в поисках конца (если это подразумевалось в вопросе), но оно хитрое, там обрабатываются данные по 4 байта сразу. Ну и магия в main_loop-е.
Это не магия, а результат оптимизации. Читать память по 4 байта быстрее чем по одному.
...
Рейтинг: 0 / 0
01.02.2016, 09:23
    #39159783
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
Dima T,

Магия не в чтении, магия в main_loop-е :)
...
Рейтинг: 0 / 0
01.02.2016, 09:55
    #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
01.02.2016, 09:57
    #39159815
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление пробелов в конце строки
Shifu,

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

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

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



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

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

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

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

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


как раз совсем не нужно ничего выделять.
...
Рейтинг: 0 / 0
09.03.2016, 17:44
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление пробелов в конце строки / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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