Как работать со строками, которые считали из файла? - C (СИ)

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

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

передо мной стоит задача Считать строки из файла(длинной не более 50 ), потом удалить из них самое длинное слово, затем занести в очередь, буфер который может содержать до 10 элементов. МНЕ ПОНЯТЬ БЫ как работать со строками ,которые мы получили из файла. вот пока ,что я я сделала, очень нужна помощь , скоро экзамен ,а я не понимаю.
char  prepare_file(char* fname)
{
    FILE* fp;
    char* fname ="date.txt";
    char buf[50];
    fp= fopen(fname, "r");
    if (fp == NULL)
    {
        printf("Can not open file %s'", fname);
        return 0;
    }
do
        {
            fgets(buf, 50, fp);
            printf("%s", buf);
            
        } while (buf[0] != '\n');
        
        fclose(fp);

Решение задачи: «Как работать со строками, которые считали из файла?»

textual
Листинг программы
void del_lonsest(char*str)
{
    char delim[] = " \t\n,.?!;:", *first, *last, *p, *fmax, *lmax;
    int max = 0, flag = 0, sym = 1, j;
    for(p = str; *p; p++, sym = 1){
        for(j = 0; delim[j]; j++)
            if(*p == delim[j])
                sym = 0;
        if(sym){
            if(!flag){
                first = p;
                flag = 1;
            }
        }
        else{
            if(flag){
                last = p - 1;
                flag = 0;
                if(last - first > max){
                    max = last - first;
                    fmax = first;
                    lmax = last;
                }
            }
        }
    }
    for(lmax++; *lmax; ){
        *fmax++ = *lmax++;
    }
    *fmax = '\0';
}

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

  1. В функции del_lonsest происходит удаление дубликатов из строки, которая была считана из файла.
  2. Переменная delim содержит разделители: пробел, табуляция, перевод строки, запятая, точка, вопросительный знак, восклицательный знак, точка с запятой, двоеточие и точка.
  3. Переменная first содержит начало первого вхождения подстроки, которая повторяется в строке.
  4. Переменная last содержит конец последнего вхождения подстроки, которая повторяется в строке.
  5. Переменная p является указателем на текущий символ в строке.
  6. Переменная sym используется для определения того, является ли текущий символ разделителем.
  7. Переменная flag используется для определения того, найдено ли уже вхождение подстроки.
  8. Переменная max содержит максимальное количество повторяющихся подстрок.
  9. Переменная fmax используется для хранения указателя на первый символ вхождения подстроки в результат.
  10. Переменная lmax используется для хранения указателя на последний символ вхождения подстроки в результат.
  11. В цикле for перебираются все символы в строке.
  12. В каждой итерации цикла проверяется, является ли текущий символ разделителем.
  13. Если текущий символ является разделителем, то проверяется, было ли найдено вхождение подстроки.
  14. Если вхождение подстроки найдено, то обновляется информация о первом и последнем вхождении подстроки.
  15. Если текущий символ не является разделителем, то проверяется, было ли найдено вхождение подстроки.
  16. Если вхождение подстроки найдено, то обновляется информация о первом и последнем вхождении подстроки.
  17. Если вхождение подстроки не найдено, то обновляется информация о первом и последнем вхождении подстроки.
  18. Если вхождение подстроки найдено, то обновляется информация о максимальном количестве повторений подстроки.
  19. Если текущий символ является последним символом в строке, то обновляется информация о последнем вхождении подстроки.
  20. В цикле for перебираются все символы в строке, начиная с последнего символа вхождения подстроки, и копируются в результат.
  21. В конце функции добавляется нулевой символ в результат.

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

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