Удаление лишних пробелов и знаков табуляции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите решить проблему, удаляет лишние пробелы, а знаки табуляции нет, нужно чтобы удаляло знаки табуляции и лишние ещё пробелы. Если что функция clear удаляет табуляции, и пробелы.
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
 
#define SIZE 5
struct Line {
int n;
char *p;
};
struct Matrix {
int m;
struct Line *el;
};
char* getStr();
void work(char*, char*, char*);
char* clear(char*);
int input_Mat(struct Matrix*, char*);
void print_Mat(struct Matrix, char*);
int main() {
setlocale(LC_ALL,".1251");
 
struct Matrix M;
char *str, *res1, *res2;
while (printf("\nВведите строку: \n"), str = getStr()) {
str = clear(str);
 
input_Mat(&M, str);
printf("Полученная строка: \n%s\n", str);
print_Mat(M, str);
}
 
system("pause");
return 0;
}
 
void print_Mat(struct Matrix M, char *str) {
 
int i, j, k;
for (i=0; i < M.m-1; i++) {
printf("\n");
printf("Строка[%d]:",i);
for (j=0; j < M.el[i].n; j++)
 
printf("%c", M.el[i].p[j]);
}
 
}
 
int input_Mat(struct Matrix *M, char *str) {
int i, j = 0, len = 0;
for (i = 0; i < strlen(str); i++, j++) {
if (str[i] == '.')
len = len + 1;
}
if (len==0)
M->m = 2;
M->m = len+1;
 
if ((M->el = (struct Line*)calloc(M->m, sizeof(struct Line))) == NULL)
return 0;
 
for (i = 0; i < M->m; i++) {
if ((M->el[i].p = (char*)calloc(strlen(str), sizeof(char))) == NULL)
 
return 0;
}
i = 0;
int m = 0;
M->el[m].n = 0;
for (i = 0, j = 0; i < strlen(str); j++, i++) {
 
if (str[i]!= '.') {
M->el[m].p[j] = str[i];
M->el[m].n = M->el[m].n + 1;
}
else {
M->el[m].p[j] = '.';
M->el[m].n = M->el[m].n + 1;
m=m + 1;
 
j=-1;
 
}

}
 
return 1;
}
 
char* clear(char *s0) {
 
char *str=(char *)malloc(1);
char *str1=(char *)malloc(1);
int i, j, len = 0;
*str='\0';
*str1='\0';

str=(char *)realloc(str, strlen(s0) + 1);
str1=(char *)realloc(str, strlen(s0) + 1);

for (j = 0, i = 0; i < strlen(s0); i++, j++)
if ((s0[i]==' ') && (s0[i + 1]==' '))
 
j--;
 
else
str1[j]=s0[i];
 
str1[j]='\0';
 
for (j = 0, i = 0; i < strlen(str1); i++, j++)
if ((str1[i]==' ') && ((str1[i + 1]==',') || (str1[i + 1]=='\t') || (str1[i + 1]=='!') || (str1[i + 1]=='?') || (str1[i + 1]==':') || (str1[i + 1]=='.')))
 
j--;
 
else
str[j]=str1[i];

if(!(str[j - 1]=='.'))
 
strcat(str, ".");
str[j+1]='\0';
return str;
 
}
 
void work(char *s0, char *s1, char *s2) {
 
}
 
char* getStr() {
char *str=(char *)malloc(1);
char buf[SIZE + 1];
int n,len= 0;
*str='\0';
do {
n=scanf("%5[^\n]", buf, SIZE + 1);
if (n < 0) {
free(str);
str=NULL;
continue;
}
if (n == 0)
scanf("%*c");
else {
len+=strlen(buf);
str=(char *)realloc(str, len + 1);
strcat(str, buf);
}
} while (n > 0);
return str;
}

Решение задачи: «Удаление лишних пробелов и знаков табуляции»

textual
Листинг программы
char* rep_space_clear(char* s){
    char* p, *t = s;
    p=s;
    while(*s)
    {
        if(((*p == ' ')  && (*(p + 1) == ' ')) || 
           ((*p == '\t') && (*(p + 1) == '\t')))
        {
            ++p;
            continue;
        }
        ++s;
        *s = *++p;
    }
    return t;
}

Объяснение кода листинга программы

  1. В функции rep_space_clear происходит удаление повторяющихся пробелов и символов табуляции из строки, передаваемой в качестве аргумента s.
  2. В начале функции инициализируются две переменные указателя типа char* - p и t. Переменная p указывает на текущий символ в строке, а переменная t - на начало строки.
  3. Переменная p инициализируется значением s, то есть она указывает на первый символ в строке.
  4. В цикле while происходит проход по всем символам строки, начиная с первого.
  5. Внутри цикла выполняется проверка: если текущий символ является пробелом и следующий за ним символ также является пробелом, или если текущий символ является символом табуляции и следующий за ним символ также является символом табуляции, то происходит пропуск этих символов (увеличивается значение указателя p, и выполнение цикла продолжается со следующей итерации).
  6. Если текущий символ не является пробелом или символом табуляции, то он копируется в следующую позицию в строке (увеличивается значение указателя s, и значение текущего символа присваивается значению следующего символа в строке, увеличивая значение указателя p).
  7. После окончания цикла возвращается значение переменной t, то есть исходная строка без повторяющихся пробелов и символов табуляции.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы