Работа со строками в памяти остается строки после выхода из программы - 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); }
Объяснение кода листинга программы
В этом коде выполняется задача обработки ввода с клавиатуры строки символов и подсчета количества введенных пробелов, табуляций и переносов строки. Код выполняет следующие действия:
- Инициализирует переменную count значением 0, которая будет использоваться для подсчета количества пробелов, табуляций и переносов строки.
- Инициализирует переменную b значением 1, которая используется для определения условия вывода запятой после пробела, табуляции или переноса строки.
- В цикле do-while считывает каждый символ из стандартного ввода до тех пор, пока не встретит символ новой строки '\n'.
- Проверяет, является ли текущий символ пробелом, табуляцией или переносом строки, и если это так, то выводит запятую, увеличивает значение count на 1 и устанавливает b в 0, чтобы прекратить дальнейший вывод запятых.
- Если текущий символ не является пробелом, табуляцией или переносом строки, то устанавливает b в 1, чтобы начать следующий цикл проверки.
- Выводит текущий символ.
- После окончания цикла do-while выводит значение count. Переменные:
- count - переменная типа int, используется для подсчета количества пробелов, табуляций и переносов строки. Инициализируется значением 0.
- c - переменная типа char, используется для хранения текущего считанного символа.
- b - переменная типа int, используется для определения условия вывода запятой после пробела, табуляции или переноса строки. Инициализируется значением 1.