Записать строку с удалением пробелов и символов табуляции с использованием функций - C (СИ)
Формулировка задачи:
Не работает функция delspace.
#include <stdio.h> #define LIM 1000 // предел длины строки int get_line(char fixed_line[], int lim); //сохраняет строку в массив, возвращает длину строки void copy(char to[], char from[]); // копирует одну строку в другую void delspace(char a[], int len); // функция удаления из строки лишних пробелов и табуляций int main() { int len; // текущая длина строки char current_line[LIM]; // текущая записанная строка char fixed_line[LIM]; // измененная строка на вывод while((len = get_line(current_line, LIM))) // пока мы считываем входной поток { if(len > 1) { copy(fixed_line, current_line); // скопировать строку вводу в наш массив delspace(fixed_line, len); // удаляем пробелы и знаки табуляции в строке printf("%s\n", fixed_line); // написать строку } } return 0; } /* get_line-считывание строки в массив, возврат ее длины */ int get_line(char s[], int lim) { int i = 0; char c; for(i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i) { s[i] = c; } if(c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* copy-копирование строки from в to */ void copy(char to[], char from[]) { int i = 0; while((to[i] = from[i]) != '\0') { ++i; } } /* delete_space удаление пробелов и знаков табуляции в строке */ void delspace(char a[], int length) { int i; for(i = 0; i < length; ++i) { if(a[i] == ' ' || a[i] == '\t') { putchar('\b'); } } }
переписал функцию, но в выводе иногда дописывает элементы в количестве равные количеству пробелов.
/* delete_space удаление пробелов и знаков табуляции в строке */ void delspace(char a[], int length) { int i; int j; char lineout[1000]; for(i = 0, j = 0; i < length; ++i) { if(a[i] != ' ' && a[i] != '\t') { lineout[j] = a[i]; ++j; } else { putchar('\b'); } } for(i = 0; i < length; ++i) { a[i] = lineout[i]; } }
Решение задачи: «Записать строку с удалением пробелов и символов табуляции с использованием функций»
textual
Листинг программы
while(s[j] == ' ' || s[j] == '\t') j++; while(s[j] != ' ' && s[j] != '\t' && s[j]) s[i++] = s[j++];
Объяснение кода листинга программы
- Входная строка
s
передается в функцию. - Два вложенных цикла while используются для обработки строки.
- Внешний цикл while проверяет каждый символ в строке.
- Условие цикла while проверяет, является ли текущий символ пробелом или символом табуляции.
- Если текущий символ является пробелом или символом табуляции, то увеличивается индекс j.
- Если текущий символ не является пробелом, символом табуляции или нулевым символом, то он копируется во временную переменную s.
- Увеличивается индекс i, чтобы сохранить копированный символ в результирующей строке.
- Увеличивается индекс j, чтобы перейти к следующему символу во входной строке.
- Цикл продолжается до тех пор, пока не будет достигнут конец строки или не будет найден не пробельный, не табуляционный символ.
- Результирующая строка будет содержать только не пробельные, не табуляционные символы из входной строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д