Как удалить все пробелы и табуляции из заданной строки на языке Си?
Какая функция C, если таковая имеется, удаляет все предшествующие пробелы и символы табуляции из строки?
Благодарю.
4 ответа
В Си строка идентифицируется указателем, например char *str
или, возможно, массив. В любом случае, мы можем объявить наш собственный указатель, который будет указывать на начало строки:
char *c = str;
Затем мы можем заставить наш указатель перемещаться за любые символы, похожие на пробел:
while (isspace(*c))
++c;
Это будет перемещать указатель вперед до тех пор, пока он не будет указывать на пробел, то есть после любых начальных пробелов или табуляции. Это оставляет исходную строку без изменений - мы только что изменили расположение нашего указателя c
указывает на.
Вам нужно будет это включить, чтобы получить isspace
:
#include <ctype.h>
Или, если вы с удовольствием определите свое собственное представление о том, что такое символ пробела, вы можете просто написать выражение:
while ((*c == ' ') || (*c == '\t'))
++c;
Более простая функция для обрезки пробелов
#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;
}
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';
}
Вам просто нужно дать баффу достаточно места.
Вы можете установить счетчик для подсчета соответствующего количества пробелов и соответственно сдвигать символы на это количество пробелов. Сложность для этого заканчивается в 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';
}