Удаление пробелов от строки в C?

Я был в некоторых списках рассылки jQuery и от того, что я считал там, они, скорее всего, фильтруют именем тега тогда имя класса (или наоборот если это было быстрее). Они одержимы скоростью и использовали бы что-либо для получения капли производительности.

я действительно не волновался бы об этом слишком много так или иначе, если Вы не выполняете тот селектор тысячи времен/секунда.

, Если Вы действительно заинтересованы, попытайтесь делать некоторое сравнительное тестирование и посмотрите, который быстрее.

45
задан Spikatrix 23 May 2015 в 06:57
поделиться

5 ответов

Самые простые и эффективные обычно не идут вместе ...

Вот возможное решение:

void remove_spaces(char* s) {
    const char* d = s;
    do {
        while (*d == ' ') {
            ++d;
        }
    } while (*s++ = *d++);
}
76
ответ дан 26 November 2019 в 20:59
поделиться

В 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);

Вы можете понять, почему люди изобрели другие языки;)

8
ответ дан 26 November 2019 в 20:59
поделиться

Вот очень компактная, но полностью правильная версия:

do while(isspace(*s)) s++; while(*d++ = *s++);

А вот, просто для моего развлечения, версии с кодовым полем, которые не совсем корректны и вызывают недовольство комментаторов.

Если вы можете рискнуть каким-то неопределенным поведением и никогда не иметь пустых строк, вы можете избавиться от тела:

while(*(d+=!isspace(*s++)) = *s);

Черт возьми, если под пробелом вы подразумеваете просто пробел:

while(*(d+=*s++!=' ')=*s);

Не используйте это в продакшене :)

18
ответ дан 26 November 2019 в 20:59
поделиться
#include <ctype>

char * remove_spaces(char * source, char * target)
{
     while(*source++ && *target)
     {
        if (!isspace(*source)) 
             *target++ = *source;
     }
     return target;
}

Примечания;

  • Это не поддерживает Unicode.
2
ответ дан 26 November 2019 в 20:59
поделиться

Я предполагаю, что строка C находится в фиксированной памяти, поэтому, если вы заменяете пробелы, вам нужно сдвинуть все символы.

Кажется, проще всего создать новую строку и перебрать исходную один и копируйте только непробельные символы.

0
ответ дан 26 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: