Лучший алгоритм для разделения продвижения и конечных пробелов в C [дубликат]

Проблемой оказывается имя функции в определении функции float lower_bound(Repr). К сожалению, lower_bound конфликтует с функцией из стандартной библиотеки в <algorithm>. Без шаблона по умолчанию у компилятора было недостаточно информации, чтобы различать пользовательскую функцию и стандартную библиотеку.

8
задан Bill the Lizard 19 September 2012 в 22:05
поделиться

9 ответов

Можно сделать это полностью на месте.

 void stripLeadingAndTrailingSpaces(char* string){

     assert(string);

     /* First remove leading spaces */

     const char* firstNonSpace = string;

     while(*firstNonSpace != '\0' && isspace(*firstNonSpace))
     {
          ++firstNonSpace;
     }

     size_t len = strlen(firstNonSpace)+1;         

     memmove(string, firstNonSpace, len);

     /* Now remove trailing spaces */

     char* endOfString = string + len;

     while(string < endOfString  && isspace(*endOfString))
     {
          --endOfString ;
     }

     *endOfString = '\0';

}
4
ответ дан 5 December 2019 в 04:30
поделиться

Если Вы находитесь на Linux/Windows и имеете библиотеку, бойкую связанный в Вашу программу, можно использовать стандартную программу g_strstrip().

1
ответ дан 5 December 2019 в 04:30
поделиться

Необходимо смочь сделать это оперативный; разделение пробела никогда не может заставлять строку расти. Вы смогли делать это без первой проверки длины строки, но выполнение так могло бы быть напрасно "умным". Необходимо изучить memmove() функция, в дополнение к тем @Norman Ramsey упомянул.

1
ответ дан 5 December 2019 в 04:30
поделиться
int i = strlen(s) - 1;
while (isspace(s[i]))
    s[i--] = '\0';
while (isspace(*s))
    s++;

Это должно заботиться о проблеме, пока Вы не заботитесь о том, чтобы портить строку как сумасшедший и если Вы не заботитесь об утечках памяти!

1
ответ дан 5 December 2019 в 04:30
поделиться

Вот версия с помощью isspace:

char * trim(char *c) {
    char * e = c + strlen(c) - 1;
    while(*c && isspace(*c)) c++;
    while(e > c && isspace(*e)) *e-- = '\0';
    return c;
}
7
ответ дан 5 December 2019 в 04:30
поделиться
char *strstrip(char *s)
{
    char *end;

    while ( (*s) && isspace( *s))
        s++;

    if(!( *s) )
        return s;
    end = s;

    while( ! *end)
        end++;
    end--;

    while (end ! = s && isspace( *end))
        end--;
    *(end + 1) = '\0';

    return s;
}

Это - в основном больше оптимизированного кода (с точки зрения скорости и размера кода).

Если мы должны сохранить пространство памяти затем,

void strstrip(char *s)
{
    char *start;
    char *end;

    start = s; 
    while ( (*start) && isspace( *start))
        start++;

    if(!( *start) ) 
    {
        *s='\0';
        return ;
    }
    end = start;

    while( ! *end)
        end++;
    end--;

    while (end ! = start && isspace( *end))
        end--;
    *(end + 1) = '\0';

    memmove(s, start, end-start+1);

    return;
}
3
ответ дан 5 December 2019 в 04:30
поделиться

Вот то, как ядро Linux делает обрезку, названную strstrip ():

char *strstrip(char *s)
{
    size_t size;
    char *end;

    size = strlen(s);

    if (!size)
        return s;

    end = s + size - 1;
    while (end >= s && isspace(*end))
        end--;
    *(end + 1) = '\0';

    while (*s && isspace(*s))
        s++;

    return s;
}

В основном лучшая отформатированная и проверенная в ошибке версия, что предыдущий сказанный плакат.

21
ответ дан 5 December 2019 в 04:30
поделиться

Этот вопрос смотрит, как будто это мог бы быть вопрос о домашней работе, таким образом, я отвечу косвенно: ищите страницы справочника для isspace (3) и strlen (3) и используйте адресную арифметику с указателями. Также в зависимости от проблемы под рукой Вам, возможно, понадобится malloc (3) для содержания пространства для результата.

Не забывайте, что представление струны до включает запаздывающие 0 байтов, часто записанные '\0', который не считается как часть длины строки.

9
ответ дан 5 December 2019 в 04:30
поделиться

Вот более краткая и более безопасная версия первой функции lakshmanaraj:

#include <ctype.h>
char *mytrim(char *s)
{
    if(s) { /* Don't forget to check for NULL! */
        while(*s && isspace(*s))
            ++s;
        if(*s) {
            register char *p = s;
            while(*p)
                ++p;
            do {
                --p;
            } while((p != s) && isspace(*p));
            *(p + 1) = '\0';
        }
    }
    return(s);
}
3
ответ дан 5 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

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