Как записать предложение в массив строк - C (СИ)

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

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

в файле должно быть например: qwrqr! qwrewqr. etet. etwtq. qasfas.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{int m=0;
    int i=0, j, n=0, tochka=0;
    FILE *fp;
    char string[255][255], str[255];
    int c;
    if((fp=fopen("2.txt", "r"))!=NULL) 
    {
        for (;c!=EOF; )
        {
            c=fgetc(fp);
            if(c=='\n')
            n++;//количество \n
            else
            {
                str[i]=c;
                i++;
 
                if((c=='.') || (c=='!') || (c=='?'))
                    tochka++;
            }
        }
    }
fclose(fp);
 
printf("%d", n);
printf("\n%s", str);
printf("\nkol . %d", tochka); //до этого момента все хорошо
int len=strlen(str);
printf("\nLEN = %d\n", len);
i=0;
int len2=0;
 
for(j=0; j<len; j++)// кажись тут где сбой, но вроде все логично
{
    if((str[j]=='.') || (str[j]=='!') || (str[j]=='?'))
    {
        string[i][j]=str[j];
        i++;
    }
    else
        string[i][j]=str[j];
 
}
 
   for(i=0; i<tochka; i++)//tochka это сколько предложений в файле
    {
        len2=strlen(string[i]);//узнаю сколько элементов в рассматриваемой строке
        {
            for(j=0; j<len2; j++)//по этой строке пробегаюсь
            {
                printf("%s", string[i][j]);
            }
        }
    }
}

Решение задачи: «Как записать предложение в массив строк»

textual
Листинг программы
// в файле
// qwrqr! qwrewqr.
// etet.
// etwtq. qasfas.
 
#include<conio.h>
#include<stdio.h>
#include<string.h>
 
int main()
{
    int m=0;
    int i=0, j, n=0, tochka=0;
    FILE *fp;
    char string[255][255], str[255];
    int c = '\0';
    if((fp=fopen("1.txt", "r"))!=NULL) 
    {
        for (;c!=EOF; )
        {
            c=fgetc(fp);
            if(c=='\n')
                n++;//количество \n
            else
            {
                str[i]=c;
                i++;
 
                if((c=='.') || (c=='!') || (c=='?'))
                    tochka++;
            }
        }
        str[i - 1] = '\0';
    }
    fclose(fp);
 
    printf("%d", n);
    printf("\n%s", str);
    printf("\nkol . %d", tochka); //до этого момента все хорошо
    int len=strlen(str);
    printf("\nLEN = %d\n", len);
    i=0;
    int k;
    int len2=0;
 
    for(j=0, k = 0; j<len; j++)// кажись тут где сбой, но вроде все логично
    {
        if((str[j]=='.') || (str[j]=='!') || (str[j]=='?'))
        {
            string[i][k]=str[j];
            string[i][k + 1] = '\0';
            i++;
            if (i == tochka)
                break;
            k = 0;
            
        }
        else
        {
            string[i][k]=str[j];
            ++k;
        }
 
    }
 
    for(i=0; i<tochka; i++)//tochka это сколько предложений в файле
    {
        printf("%s", string[i]);
        printf("\n");
        
        //len2=strlen(string[i]);//узнаю сколько элементов в рассматриваемой строке
        //{
        //    for(j=0; j<len2; j++)//по этой строке пробегаюсь
        //    {
        //        printf("%c", string[i][j]);
        //    }
        //    printf("\n");
        //}
    }
}

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

В этом коде задачей является запись предложений из файла в массив строк. Вот список действий, которые происходят в коде:

  1. В начале кода объявляются переменные:
    • m - счетчик для прохода по предложениям в файле
    • i, j, n, tochka - счетчики для прохода по строкам и символам в строке
    • fp - указатель на файл
    • str - строка, в которой проверяется каждый символ
    • c - текущий символ из файла
    • string - массив строк, в который записываются предложения
    • len, len2 - счетчики для определения длины строки
    • k - дополнительный счетчик для пробежки по строке
  2. Открывается файл 1.txt для чтения.
  3. Начинается цикл, который читает символы из файла до конца строки (до символа новой строки).
  4. Если текущий символ является точкой, восклицательным знаком или вопросительным знаком, увеличивается счетчик tochka.
  5. Если текущий символ не является точкой, восклицательным знаком, вопросительным знаком или пробелом, он записывается в массив str.
  6. После завершения чтения строки, последнему символу в строке присваивается нулевой символ.
  7. После завершения чтения файла, закрывается файл.
  8. Выводится количество предложений в файле (значение переменной n).
  9. Выводится первое предложение из файла (значение переменной str).
  10. Выводится количество предложений в файле (значение переменной tochka).
  11. Вычисляется длина строки str (значение переменной len).
  12. Начинается цикл, который пробегается по каждому предложению в массиве string.
  13. Каждое предложение выводится на экран.
  14. Для каждого предложения вычисляется его длина (значение переменной len2).
  15. Для каждого символа в предложении выводится его значение. Ошибка в коде заключается в том, что в цикле, который записывает предложения в массив string, не учитывается, что предложение может заканчиваться не только точкой, восклицательным знаком или вопросительным знаком, но и пробелом. Это приводит к тому, что весь текст после последнего символа, который является точкой, восклицательным знаком или вопросительным знаком, записывается в следующую строку массива, как одно предложение, вместо того, чтобы быть разделенным на отдельные предложения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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