Удаление лишних пробелов и знаков табуляции - 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; }
Объяснение кода листинга программы
- В функции
rep_space_clear
происходит удаление повторяющихся пробелов и символов табуляции из строки, передаваемой в качестве аргументаs
. - В начале функции инициализируются две переменные указателя типа
char*
-p
иt
. Переменнаяp
указывает на текущий символ в строке, а переменнаяt
- на начало строки. - Переменная
p
инициализируется значениемs
, то есть она указывает на первый символ в строке. - В цикле
while
происходит проход по всем символам строки, начиная с первого. - Внутри цикла выполняется проверка: если текущий символ является пробелом и следующий за ним символ также является пробелом, или если текущий символ является символом табуляции и следующий за ним символ также является символом табуляции, то происходит пропуск этих символов (увеличивается значение указателя
p
, и выполнение цикла продолжается со следующей итерации). - Если текущий символ не является пробелом или символом табуляции, то он копируется в следующую позицию в строке (увеличивается значение указателя
s
, и значение текущего символа присваивается значению следующего символа в строке, увеличивая значение указателяp
). - После окончания цикла возвращается значение переменной
t
, то есть исходная строка без повторяющихся пробелов и символов табуляции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д