Оптимизация простой функции - C (СИ)
Формулировка задачи:
Задача- Напишите функцию, которая обрезает пробелы в конце переданной ей строки. Функция должна быть написана в расчёте на работу с очень длинными строками с очень большим количеством пробелов, оптимизирована по количеству обращений к памяти.
Функцию написал- нет проблем.. протестил на строках длинной порядка 1000 символов.
Думаю тут ограничение только на размер типа unsigned int.
Вопрос - ее как то еще можно оптимизировать на ваш взгляд?
ИМХО - все обращения к памяти это вычисление длинны строки стандартной функцией и просмотр элементов строки с конца.
Вот, решил проконсультироваться. Заранее спс!
void TrimRight( char *str )
{
unsigned int nStrLen = strlen(str);
while(str[nStrLen-1] == ' ')
nStrLen--;
if(str[nStrLen-1] != ' ')
str[nStrLen] = 0;
else
str[nStrLen-1] = 0;
}Решение задачи: «Оптимизация простой функции»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
char * rtrim(char * s){
char * t = s + strlen(s) - 1;
while ( t >= s && isspace(*t) )
*t-- = 0;
return s;
}
*/
char * rtrim(char * s){
char * pStr = s, * pSpc = NULL;
for ( ; *pStr; ++pStr ){
if ( isspace(*pStr) ){
if ( !pSpc )
pSpc = pStr;
}
else
pSpc = NULL;
}
if ( pSpc )
*pSpc = '\0';
return s;
}
int main(void){
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
printf("Result: \"%s\"\n", rtrim(buf));
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию rtrim, которая принимает указатель на строку в качестве аргумента и возвращает указатель на отформатированную строку
- Проходим по каждому символу входной строки
- Если текущий символ является пробелом и предыдущий символ не является пробелом, то заменяем текущий символ на 0
- Возвращаем отформатированную строку
- В функции main запрашиваем у пользователя ввод строки до тех пор, пока он не введет пустую строку
- Выводим отформатированную строку на экран
- Возвращаем 0, чтобы указать, что программа успешно завершилась