Убрать лишние пробелы в последовательности - C (СИ)
Формулировка задачи:
Есть последовательность символов. убрать все лишние пробелы, тоесть из нескольких пробелов ,что стоят подряд, оставить только один
Решение задачи: «Убрать лишние пробелы в последовательности»
textual
Листинг программы
#include <stdio.h>
char* Pack(char text[]) {
char* ptr = text;
unsigned offs = 0;
unsigned space = 0;
for (; *ptr; ++ptr) {
if (*ptr == ' ') {
space++;
}
else {
if (space) {
offs += space - 1;
space = 0;
}
}
*(ptr - offs) = *ptr;
}
*(ptr - offs) = 0;
return text;
}
int main() {
char text[] = "Hello World! I Am Student !";
printf("%s\n", Pack(text));
return 0;
}
Объяснение кода листинга программы
- В функции
Packпредставлен код, который удаляет лишние пробелы из строки, переданной в качестве аргумента. - Строка, которую необходимо обработать, сохраняется в переменной
text. - В функции объявлены следующие переменные:
ptr- указатель на текущий символ в строке;offs- смещение, на котором происходит замена последнего пробела на символ;space- счётчик пробелов.
- В цикле
forпроисходит проход по каждому символу строки. - Если текущий символ является пробелом (
*ptr == ' '), то счётчик пробелов увеличивается (space++). - Если текущий символ не является пробелом (
*ptr != ' '), то проверяется значение счётчика пробелов. - Если счётчик пробелов больше 0, то:
- смещение увеличивается на значение счётчика пробелов минус один (
offs += space - 1;); - счётчик пробелов сбрасывается в ноль (
space = 0;);
- смещение увеличивается на значение счётчика пробелов минус один (
- Значение текущего символа заменяется на значение символа, находящегося по смещению от начала строки (
*(ptr - offs) = *ptr;). - После прохода по всем символам строки, в
*(ptr - offs)записывается ноль (*(ptr - offs) = 0;), чтобы корректно завершить строку. - Функция возвращает исходную строку.
- В функции
mainсоздаётся тестовая строкаHello World! I Am Student !. - С помощью функции
Packиз этой строки удаляются лишние пробелы, и результат выводится на экран с помощью функцииprintf(printf(%s\n, Pack(text));). - В конце функции
mainвозвращается ноль, чтобы указать, что программа успешно завершилась.