Как работать с большими текстами? - C (СИ)
Формулировка задачи:
Что посоветуете чтоб программка начала работать с большими текстами. С небольшой строкой у нас считвывает нормально, а с длинной считывание не происходит (зацикливается)
(ввожу ловыпып2олр5длпр программа убирает 2 и 5 оставшиется 3 слова упорядочивает по алфавиту и выводит в консоль)
(при вводе выаоооооолопваылпорлвыапрлдовыпрлваыплодпвы4ылвилдпылопы выдает дамп памяти)
не могу понять проблему
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int dls, i=0;
char s[300];
char e;
printf("Vvedite text\n");
//scanf ("%s", s);
do
{
scanf("%c", &s[i]);
i++;
}
while(s[i-1] != '\n');
s[i-1] = '\0';
for(i=0; s[i] != '\0'; i++)
dls = strlen(s);
int j=0,k=0,n=0,f=0;
char ms[50][400],c[400];
// printf("%d\n",__LINE__);
while(n<=dls)
{
//while(!((s[n] < 0x41 || s[n] > 0x5A) && (s[n] < 0x61 || s[n] > 0x7A)))
while((s[n]!=',' && s[n]!= '.' && s[n]!= '1' && s[n]!= '2' && s[n]!= '3' && s[n]!= '4' && s[n]!= '5' && s[n]!= '6'
&& s[n]!= '7' && s[n]!= '8' && s[n]!= '9' && s[n]!= '0' && s[n]!= '-' && s[n]!= '=' && s[n]!= '!' && s[n]!= '@'
&& s[n]!= '#' && s[n]!= '$' && s[n]!= '%' && s[n]!= '^' && s[n]!= '&' && s[n]!= '*' && s[n]!= '(' && s[n]!= ')'
&& s[n]!= '_' && s[n]!= '+' && s[n]!= '"' && s[n]!= 'В№' && s[n]!= ';' && s[n]!= ':' && s[n]!= '?' && s[n]!= '/'
&& s[n]!= '|' && s[n]!= '>' && s[n]!= '<' && s[n]!= '`' && s[n]!= '~' && s[n]!= ' '))
{
ms[i][j]=s[n];
j++;
n++;
}
j = 0;
i++;
n++;
}
// printf("%d\n",__LINE__);
do
{
f=0;
for(j=i-1;j>k;j--)
{
if (strcmp(ms[j],ms[j-1])<0)
{
strcpy(c,ms[j]);
strcpy(ms[j],ms[j-1]);
strcpy(ms[j-1],c);
f=1;
}
}
k++;
}
while(f);
// printf("%d : i=%d\n",__LINE__,i);
for (j=0;j<i;j++)
{
//printf("%d\n",__LINE__);
if (ms[j][0])
printf("text: %s\n",ms[j]);
}
//printf("%d\n",__LINE__);
return EXIT_SUCCESS;
}
циклится при вводе большого текста, посоветуйте в какую сторону шагать
Решение задачи: «Как работать с большими текстами?»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i = 0, j = 0, k = 0, n = 0, f = 0;
char s[] = "qqqqwwwwwwwwertdfgcsvxbnvhfgv4hgfbvcbdvxcsdbvcv7cbxnxbxvdghhsyyyttwrfqfqv"
"vsbbnxhzyh9ffffggggggbbbbbbbbbbddddddd56aaaaaaaaafffffffdddddddd44ddddddddddfffffffcc"
"bbbbbbbbbb5wwwwwwwwwwwweeeeeeeeeeeeerrrrrrrrr0tttttttttttttttt3eeeeeeeeeeeeeeeeeeej5f"
"ghk1z";
char ms[50][400],c[400];
while(s[n]){
while((s[n] >= 'a' && s[n] <= 'z')){
ms[i][j]=s[n];
j++;
n++;
}
j = 0;
i++;
n++;
}
do{
f=0;
for(j=i-1;j>k;j--)
{
if (strcmp(ms[j],ms[j-1])<0)
{
strcpy(c,ms[j]);
strcpy(ms[j],ms[j-1]);
strcpy(ms[j-1],c);
f=1;
}
}
k++;
}while(f);
for (j=0;j<i;j++){
if (ms[j][0])
printf("text: %s\n",ms[j]);
}
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с памятью и строками.
- Объявление переменных:
- i, j, k, n, f - для управления циклами;
- s - строка, с которой ведется работа;
- ms - массив строк, в который разбивается исходная строка;
- c - временная строка для обмена значениями в массиве ms.
- Заполнение массива ms строками из s.
- Приведение строк в нижний регистр и сортировка массива ms по алфавиту (метод сортировки пузырьком).
- Обмен значениями в массиве ms при необходимости (если текущая строка меньше предыдущей).
- Вывод отсортированных строк из массива ms.
- Возврат 0, означающий успешный завершение работы программы.