В Си строка - это массив байтов. Вы не можете назначить «пустой байт», но вы должны сдвинуть оставшуюся часть байтов вперед.
Вот один из способов сделать это:
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++));