Как работать с большими текстами? - 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, означающий успешный завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д