Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию - C (СИ)
Формулировка задачи:
Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию getline (чтобы избежать дублежа)?
И мне еще не совсем понятно в этой программе функция filter (что такое i и j?)
#include <stdio.h>
#define MAXLINE 1000 /* максимальный размер вводимой строки + 1 */
int getl(char line[], int maxline);
int filter(char to[], char from[]);
int main()
{
int len; /* длина текущей строки */
char line[MAXLINE]; /* текущая строка */
char newline[MAXLINE]; /* новая строка */
len = 0;
while ((len = getl(line, MAXLINE)) > 0) {
if ((len = filter(newline, line)) != 1)
printf("| %s", newline);
}
return 0;
}
/* getline: читает строку в s, возвращает длину */
int getl(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* filter: преобразует содержимое 'from' в 'to'
* убирает повторные пробелы и табуляции */
int filter(char to[], char from[])
{
int c, i, j, sflag;
i = 0;
j = 0;
sflag = 0;
while ((c = from[i]) != '\n') {
if (c == ' ' || c == '\t'){
if (sflag == 0) {
to[j] = ' ';
sflag = 1;
++j;
}
}
else {
to[j] = c;
sflag = 0;
++j;
}
++i;
}
if (c == '\n') {
to[j] = c;
++j;
}
to[j] = '\0';
return j;
}Решение задачи: «Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию»
textual
Листинг программы
#include <stdbool.h>
#include <stdio.h>
void delete_char(char* str, int idx)
{
while( str[idx] ) {
str[idx] = str[++idx];
}
}
void remove_spaces(char* str)
{
char previous_char = str[0];
int i = 1;
while( previous_char ) {
if( previous_char == ' ' && str[i] == ' ' ) {
delete_char(str, i);
} else {
previous_char = str[i++];
}
}
}
void chomp(char* str)
{
while( *str ) {
if( *str == '\n' ) {
*str = '\0';
break;
}
++str;
}
}
int main()
{
char buf[1000];
while( true ) {
fflush(stdin);
fgets(buf, sizeof(buf), stdin);
if( buf[0] == '\n' ) break;
chomp(buf);
remove_spaces(buf);
printf("%s\n", buf);
}
return 0;
}