Записать строку с удалением пробелов и символов табуляции с использованием функций - 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, чтобы перейти к следующему символу во входной строке.
- Цикл продолжается до тех пор, пока не будет достигнут конец строки или не будет найден не пробельный, не табуляционный символ.
- Результирующая строка будет содержать только не пробельные, не табуляционные символы из входной строки.