Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’ - C (СИ) (78935)
Формулировка задачи:
всем привет
народ помогите разобраться в чем ошибка, программа почему то печатает левое при наборе 3 и более строк
вот задание данное мне
Ввести массив строк символов (текст), которые могут содержать символы ‘*’. Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’.
в чем ошибка то? ничего не пойму, и вролде работает все норм но неправильно почему то, подскажите плиз оч надо
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> char *out; char **vvod() { clrscr(); char **txt, size[128]; txt=NULL; int len=-1; txt=(char**)malloc(sizeof(char*)); for (int i=0; len!=0; i++) { gets(size); len=strlen(size); txt[i]=(char*)malloc((len+1)*sizeof(char)); strcpy(txt[i], size); txt=(char**)realloc(txt,(i+1)*sizeof(char*)); } return txt; } char *copysim(char *text) { char *out; int n; n=strlen(text); out=(char*)malloc(((2*n)+1)*sizeof(char)); for(int i=0, j=0; i<n&&j<(2*n); i++) { if (text[i]!='*') { out[j]=text[i]; j++; out[j]=text[i]; j++; } } out[j]=0; return out; } void main() { char **text; text=vvod(); for (int i=0; strlen(text[i])!=0; i++) { out=copysim(text[i]); printf("%s", out); } getch(); }
разве никто не знает в чем причина? что не так в моем коде то??
Решение задачи: «Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 128 char** input(size_t* nrows) { if(nrows == NULL) { fprintf(stderr, "You must specify the pointer to store number of rows\n"); exit(1); } char** text = NULL; char* buf; size_t rows = 0; puts("Input text (Ctrl+Z or Ctrl+D to stop):"); while(1) { buf = NULL; if((buf = malloc(SIZE * sizeof(char))) == NULL) { fprintf(stderr, "Memory allocation failure\n"); exit(2); } if(fgets(buf, SIZE, stdin) == NULL) { if(feof(stdin)) break; perror("getline"); exit(3); } ++rows; if((text = realloc(text, rows * sizeof(char*))) == NULL) { fprintf(stderr, "Memory allocation failure\n"); exit(4); } text[rows - 1] = buf; }; *nrows = rows; return text; } char* processrow(const char* row) { char* buf; char* p; // Символ '\n' дублировать не будем if((buf = calloc(strlen(row) * 2, sizeof(char))) == NULL) { fprintf(stderr, "Memory allocation failure\n"); exit(5); } p = buf; while(*row) { switch(*row) { case '*': ++row; break; case '\n': *p++ = *row++; break; default: *p++ = *row; *p++ = *row++; } } return buf; } int main() { size_t nrows, i; char** text = input(&nrows); printf("After processing:...\n"); for(i = 0; i < nrows; ++i) { char* buf = processrow(text[i]); fputs(buf, stdout); free(buf); free(text[i]); } free(text); exit(0); }
Объяснение кода листинга программы
- Ввод текста, разделенного символом новой строки (Ctrl+Z или Ctrl+D для завершения ввода).
- Разбиение введенного текста на строки (при этом каждая строка сохраняется в отдельном блоке памяти).
- Проверка каждой строки на наличие символа '*'.
- Если символ '*' найден, то он пропускается, а все остальные символы дублируются.
- Вывод обработанных строк.
- Освобождение выделенной памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д