Как удалить все пробелы и табуляции из заданной строки на языке Си? - PullRequest
4 голосов
/ 03 октября 2009

Какая функция C, если таковая имеется, удаляет все предшествующие пробелы и символы табуляции из строки?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 03 октября 2009

В Си строка идентифицируется указателем, таким как char *str или, возможно, массивом. В любом случае, мы можем объявить наш собственный указатель, который будет указывать на начало строки:

char *c = str;

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

while (isspace(*c))
    ++c;

Это будет перемещать указатель вперед, пока он не будет указывать на пробел, то есть после любых начальных пробелов или табуляции. Это оставляет исходную строку без изменений - мы только что изменили местоположение, на которое указывает наш указатель c.

Вам понадобится это включение, чтобы получить isspace:

#include <ctype.h>

Или, если вы с удовольствием определите свое собственное представление о пробеле, вы можете просто написать выражение:

while ((*c == ' ') || (*c == '\t'))
    ++c;
1 голос
/ 14 ноября 2017

Более простая функция для обрезки пробелов

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * trim(char * buff);

int main()
{
    char buff[29];
    strcpy(buff, "    \r\n\t     abcde    \r\t\n     ");
    char* out = trim(buff);
    printf(">>>>%s<<<<\n",out);
}

char * trim(char * buff)
{
    //PRECEDING CHARACTERS
    int x = 0;
    while(1==1)
    {
        if((*buff == ' ') || (*buff == '\t') || (*buff == '\r') || (*buff == '\n'))
            { 
                x++;
                ++buff;
            }
        else
            break;
    }
    printf("PRECEDING spaces : %d\n",x);
    //TRAILING CHARACTERS
    int y = strlen(buff)-1;
    while(1==1)
    {
        if(buff[y] == ' ' || (buff[y] == '\t') || (buff[y] == '\r') || (buff[y] == '\n'))
            { 
                y--;
            }
        else
            break;
    }
    y = strlen(buff)-y;
    printf("TRAILING spaces : %d\n",y);
    buff[strlen(buff)-y+1]='\0';
    return buff;
}
1 голос
/ 04 октября 2009
void trim(const char* src, char* buff, const unsigned int sizeBuff)
{
    if(sizeBuff < 1)
    return;

    const char* current = src;
    unsigned int i = 0;
    while(current != '\0' && i < sizeBuff-1)
    {
        if(*current != ' ' && *current != '\t')
            buff[i++] = *current; 
        ++current;
    }
    buff[i] = '\0';
}

Вам просто нужно дать баффу достаточно места.

0 голосов
/ 27 января 2018

Вы можете установить счетчик для подсчета соответствующего количества пробелов и соответственно сдвинуть символы на это количество пробелов. Сложность для этого заканчивается на O (n) .

void removeSpaces(char *str) {
    // To keep track of non-space character count
    int count = 0;

    // Traverse the given string. If current character
    // is not space, then place it at index 'count++'
    for (int i = 0; str[i]; i++)
        if (str[i] != ' ')
            str[count++] = str[i]; // here count is
                               // incremented
    str[count] = '\0';
}
...