Я был в некоторых списках рассылки jQuery и от того, что я считал там, они, скорее всего, фильтруют именем тега тогда имя класса (или наоборот если это было быстрее). Они одержимы скоростью и использовали бы что-либо для получения капли производительности.
я действительно не волновался бы об этом слишком много так или иначе, если Вы не выполняете тот селектор тысячи времен/секунда.
, Если Вы действительно заинтересованы, попытайтесь делать некоторое сравнительное тестирование и посмотрите, который быстрее.
Самые простые и эффективные обычно не идут вместе ...
Вот возможное решение:
void remove_spaces(char* s) {
const char* d = s;
do {
while (*d == ' ') {
++d;
}
} while (*s++ = *d++);
}
В C вы можете заменить некоторые строки на месте, например строку, возвращаемую strdup ():
char *str = strdup(" a b c ");
char *write = str, *read = str;
do {
if (*read != ' ')
*write++ = *read;
} while (*read++);
printf("%s\n", str);
Другие строки доступны только для чтения, например, те, которые объявлены в коде. Вам придется скопировать их в новую выделенную область памяти и заполнить копию, пропуская пробелы:
char *oldstr = " a b c ";
char *newstr = malloc(strlen(oldstr)+1);
char *np = newstr, *op = oldstr;
do {
if (*op != ' ')
*np++ = *op;
} while (*op++);
printf("%s\n", newstr);
Вы можете понять, почему люди изобрели другие языки;)
Вот очень компактная, но полностью правильная версия:
do while(isspace(*s)) s++; while(*d++ = *s++);
А вот, просто для моего развлечения, версии с кодовым полем, которые не совсем корректны и вызывают недовольство комментаторов.
Если вы можете рискнуть каким-то неопределенным поведением и никогда не иметь пустых строк, вы можете избавиться от тела:
while(*(d+=!isspace(*s++)) = *s);
Черт возьми, если под пробелом вы подразумеваете просто пробел:
while(*(d+=*s++!=' ')=*s);
Не используйте это в продакшене :)
#include <ctype>
char * remove_spaces(char * source, char * target)
{
while(*source++ && *target)
{
if (!isspace(*source))
*target++ = *source;
}
return target;
}
Примечания;
Я предполагаю, что строка C находится в фиксированной памяти, поэтому, если вы заменяете пробелы, вам нужно сдвинуть все символы.
Кажется, проще всего создать новую строку и перебрать исходную один и копируйте только непробельные символы.