Как записать предложение в массив строк - 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");
//}
}
}
Объяснение кода листинга программы
В этом коде задачей является запись предложений из файла в массив строк. Вот список действий, которые происходят в коде:
- В начале кода объявляются переменные:
- m - счетчик для прохода по предложениям в файле
- i, j, n, tochka - счетчики для прохода по строкам и символам в строке
- fp - указатель на файл
- str - строка, в которой проверяется каждый символ
- c - текущий символ из файла
- string - массив строк, в который записываются предложения
- len, len2 - счетчики для определения длины строки
- k - дополнительный счетчик для пробежки по строке
- Открывается файл
1.txtдля чтения. - Начинается цикл, который читает символы из файла до конца строки (до символа новой строки).
- Если текущий символ является точкой, восклицательным знаком или вопросительным знаком, увеличивается счетчик tochka.
- Если текущий символ не является точкой, восклицательным знаком, вопросительным знаком или пробелом, он записывается в массив str.
- После завершения чтения строки, последнему символу в строке присваивается нулевой символ.
- После завершения чтения файла, закрывается файл.
- Выводится количество предложений в файле (значение переменной n).
- Выводится первое предложение из файла (значение переменной str).
- Выводится количество предложений в файле (значение переменной tochka).
- Вычисляется длина строки str (значение переменной len).
- Начинается цикл, который пробегается по каждому предложению в массиве string.
- Каждое предложение выводится на экран.
- Для каждого предложения вычисляется его длина (значение переменной len2).
- Для каждого символа в предложении выводится его значение. Ошибка в коде заключается в том, что в цикле, который записывает предложения в массив string, не учитывается, что предложение может заканчиваться не только точкой, восклицательным знаком или вопросительным знаком, но и пробелом. Это приводит к тому, что весь текст после последнего символа, который является точкой, восклицательным знаком или вопросительным знаком, записывается в следующую строку массива, как одно предложение, вместо того, чтобы быть разделенным на отдельные предложения.