Работа со строками в памяти остается строки после выхода из программы - C (СИ)

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

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

Суть такова программа работает при первом запуске норм , но после второго чушь какая получается . Str1 сохраняется в памяти( пытался и память динамическую освобождать ничего не помогает . вот Условие: Подсчитать количество слов и после каждого поставить запятую. Вот код
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main(void)
{ const int n=127;
  int kol_str=0,m=0;
  char *str,*ptr,*str1;
  char rasdel[]=" ,:;.&?/!";
  clrscr();
  str=new char[n];
  str1=new char[n];
    puts("vvedite stroky");
    gets(str);
     ptr=strtok(str,rasdel);
     m=strlen(ptr);
     strncpy(str1,ptr,m);
     *(str1+m)=',';
     while(ptr!=NULL)
     {kol_str++;
      ptr=strtok(NULL,rasdel);
        if(ptr!=NULL)
         {
          strcat(str1,ptr);
          m=strlen(str1);
          str1[m]=',';
         }
     }
 printf("kol_strok=%d\n",kol_str);
 
 puts(str1);
 printf("m=%d",m);
 
 getch();
}

Решение задачи: «Работа со строками в памяти остается строки после выхода из программы»

textual
Листинг программы
#include <stdio.h>
 
int main() {
    unsigned count = 0;
    char c, b = 1;
    do {
        c = getchar()
        if ((c == ' ' || c == '\t' || c == '\n') && b) {
            putchar(',');
            count++;
            b = 0;
        } else
            b = 1;
        putchar(c);
    } while (c != '\n');
    printf("%d", count);
}

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

В этом коде выполняется задача обработки ввода с клавиатуры строки символов и подсчета количества введенных пробелов, табуляций и переносов строки. Код выполняет следующие действия:

  1. Инициализирует переменную count значением 0, которая будет использоваться для подсчета количества пробелов, табуляций и переносов строки.
  2. Инициализирует переменную b значением 1, которая используется для определения условия вывода запятой после пробела, табуляции или переноса строки.
  3. В цикле do-while считывает каждый символ из стандартного ввода до тех пор, пока не встретит символ новой строки '\n'.
  4. Проверяет, является ли текущий символ пробелом, табуляцией или переносом строки, и если это так, то выводит запятую, увеличивает значение count на 1 и устанавливает b в 0, чтобы прекратить дальнейший вывод запятых.
  5. Если текущий символ не является пробелом, табуляцией или переносом строки, то устанавливает b в 1, чтобы начать следующий цикл проверки.
  6. Выводит текущий символ.
  7. После окончания цикла do-while выводит значение count. Переменные:
  8. count - переменная типа int, используется для подсчета количества пробелов, табуляций и переносов строки. Инициализируется значением 0.
  9. c - переменная типа char, используется для хранения текущего считанного символа.
  10. b - переменная типа int, используется для определения условия вывода запятой после пробела, табуляции или переноса строки. Инициализируется значением 1.

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

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