PDA

Просмотр полной версии : [Function] trim(str[]) - Удаляет пробелы (или другие символы) из начала и конца строки



Salvacore
29.10.2013, 20:34
trim — Удаляет пробелы (или другие символы) из начала и конца строки.

Функция, как в PHP или других ЯП.

Прототип ф-ии:
stock trim(str[], Char = ' ');

Аргументы:
str[] - строка, которую необходимо обрезать;
Char - символ, который необходимо удалить, по умолчанию - пробел.

Ф-ия возвращает:
Обрезанную строку

Код:

stock trim(str[], Char = ' ')
{
new string[128], pos[2] = {-1, -1};
for(new i, l = strlen(str); i != l; i++)
{
if(str[i] != Char && pos[0] == -1) pos[0] = i;
if(str[l - 1 - i] != Char && pos[1] == -1) pos[1] = l - i;
if(pos[0] != -1 && pos[1] != -1) break;
}
strmid(string, str, pos[0], pos[1]);
return string;
}
Пример:

new test[] = " TEST FUNC! ";
printf("%s", trim(test)); //output:TEST FUNC!

new test2[] = "$$$$$$Games$$$$$$$";
printf("%s", trim(test2, '$')); //output:Games

//проверка на пустую строку:
new string[] = " ";
if(strlen(trim(string)) == 0) return printf("Пустая строка!");

new string2[] = " I ";
printf("strlen: %d", strlen(trim(string2))); //output:strlen 1

Osetin
29.10.2013, 20:39
полезно новичкам

Salvacore
29.10.2013, 20:44
полезно новичкам
Спасибо.

Sacyra
29.10.2013, 23:51
up!

Sacyra
29.10.2013, 23:52
#Carleone
я реально думал это у меня муха))))

Salvacore
29.10.2013, 23:52
up!
Спасибо:D

L0ndl3m
15.12.2013, 01:57
Вот ещё:



stock trim(str[], Char = ' ')
{
new pos;
for(pos = strlen(str); str[pos] <= Char; ) pos--;
str[pos + 1] = EOS;
for(pos = 0; str[pos] <= Char; ) pos++;
strdel(str, 0, pos);
}


Автор: Londlem

Seregamil
15.12.2013, 07:24
stock trim(str[], Char = ' ')
{
new string[128], pos[2] = {-1, -1};
for(new i, l = strlen(str); i != l; i++)
{
if(str[i] != Char && pos[0] == -1) pos[0] = i;
if(str[l - 1 - i] != Char && pos[1] == -1) pos[1] = l - i;
if(pos[0] != -1 && pos[1] != -1) break;
}
strmid(string, str, pos[0], pos[1]);
return string;
}
немного извращенный вариант у тебя, или я недопонял


trim(str[], s = ' '){//by Seregamil, хотя это никому не интересно.
for(new j = 0; j!= strlen(str); j++){
if(str[j] == s) strdel(str, j, j+1);
}
return str;
}

L0ndl3m
15.12.2013, 13:03
немного извращенный вариант у тебя, или я недопонял


trim(str[], s = ' '){//by Seregamil, хотя это никому не интересно.
for(new j = 0; j!= strlen(str); j++){
if(str[j] == s) strdel(str, j, j+1);
}
return str;
}

Функция удаляет пробелы из начала и конца строки.

Seregamil
15.12.2013, 13:04
не то.

Daniel_Cortez
15.12.2013, 16:48
немного извращенный вариант у тебя, или я недопонял


trim(str[], s = ' '){//by Seregamil, хотя это никому не интересно.
for(new j = 0; j!= strlen(str); j++){
if(str[j] == s) strdel(str, j, j+1);
}
return str;
}

Нет никакого смысла возвращать входную строку str, когда она и так передаётся по ссылке и модифицируется функцией strdel. Мало того, будет ещё теряться куча времени на вызов нативных функций strlen и strdel с каждой итерацией.

Так уж и быть, поддержу тему создания своих вариантов...

trim(str[], ch = ' '){
new len;
if(ch == '\0' || (len = strlen(str)),len == 0) return;
new pos1 = 0, pos2 = len;
while(str[pos1] == ch) ++pos1;
while(str[--pos2] == ch) {}
if(pos1 != 0 || pos2 != len)
strmid(str, str, pos1, pos2+1, len);
}

Seregamil
15.12.2013, 17:14
Мало того, будет ещё теряться куча времени
где ты увидел кучу потерянного времени?

Seregamil
15.12.2013, 17:24
И про возвращенную строку.

print(trim(str));
Если я использую такой код для моего варианта без возвращения строки - компилятор меня убъет.

Daniel_Cortez
15.12.2013, 17:28
где ты увидел кучу потерянного времени?
Под "кучей" имелось в виду сравнительно много времени, которое тратится на переход из абстрактной машины Pawn на нативный код и обратно.


И про возвращенную строку.

print(trim(str));
Если я использую такой код для моего варианта без возвращения строки - компилятор меня убъет.
No problem.

trim(str), print(str);

Seregamil
15.12.2013, 17:45
No problem.

trim(str), print(str);
так скучно, иногда мне нужно сразу обработать и вывести, а не обработать, подождать и вывести