Как заменить пробелы и вкладки ничем в C? - PullRequest
0 голосов
/ 14 ноября 2009

Я написал эту функцию:

void r_tabs_spaces(char *input) {
       int  i;
       for (i = 0; i < strlen(input); i++)
       {
        if (input[i] == ' ' || input[i] == '\t')
                    input[i] = '';
       }
}

Однако, когда я компилирую это и запускаю, компилятор жалуется, что «ошибка: пустая символьная константа» в строке, где я пытаюсь ввести [i] = '';

Как я могу сделать это в C тогда?

Ответы [ 4 ]

8 голосов
/ 14 ноября 2009

В Си строка - это массив байтов. Вы не можете назначить «пустой байт», но вы должны сдвинуть оставшуюся часть байтов вперед.

Вот один из способов сделать это:

char *write = str, *read = str;
do {
   // Skip space and tab
   if (*read != ' ' && *read != '\t')
       *(write++) = *read;
} while (*(read++));

Помните, что литеральные строки в C обычно находятся в защищенной от записи памяти, поэтому вы должны скопировать их в кучу, прежде чем сможете их изменить. Например, это обычно segfaults:

char *str = "hello world!"; // Literal string
str[0] = 'H'; // Segfault

Вы можете скопировать строку в кучу с помощью strdup (среди прочих):

char *str = strdup("hello world!"); // Copy string to heap
str[0] = 'H'; // Works

РЕДАКТИРОВАТЬ: согласно вашему комментарию, вы можете пропустить только начальные пробелы, помня тот факт, что вы видели непробельный символ. Например:

char *write = str, *read = str;
do {
   // Skip space and tab if we haven't copied anything yet
   if (write != str || (*read != ' ' && *read != '\t')) {       
       *(write++) = *read;
   }
} while (*(read++));
1 голос
/ 14 ноября 2009

Если у вас есть указатель на строку

"            string with leading spaces"
 ^ pointer

просто переместите ...

"            string with leading spaces"
             ^ pointer

например:

#include <ctype.h>
/* ... */
char mystring[] = "            string with leading spaces";
char *pointer = mystring;
while (*pointer && isspace((unsigned char)*pointer)) ++pointer;
/* pointer now points to a (possibly empty) string with no leading spaces */
0 голосов
/ 14 ноября 2009

Используйте

foo += strspn(foo, " \t");

для перемещения указателя foo на первый символ, который не является пробелом или табуляцией.

Чтобы фактически удалить символы из динамически размещаемой строки, используйте

size_t offset = strspn(foo, " \t");
size_t size = strlen(foo + offset) + 1;
foo = realloc(memmove(foo, foo + offset, size), size);
0 голосов
/ 14 ноября 2009

Способ удалить символ строки - переместить остальную часть строки на один символ назад.

...