Другие языки программирования и технологии

Работа со строками в Си

Имеется задача в строке записаны несколько предложений. Каждое предложение заканчивается точкой, вопросительным или восклицательными знаками. а) Вывести на экран предложения, в которых есть хотя бы одно слово состоящее из 7 букв. б) Посчитать во втором предложении однобуквенных слов

Я правильно думаю сначала мы делаем проверку оканчиватся ли она точкой, вопросительным или восклицательным знаком, затем есть ли между ними пробел, дальше смотрим количество букв в слове и выводим предложения.
Создаёте буфер и флаг. Буфер для того чтобы писать в него предложение от начала до конца. Флаг для слова состоящего из 7 букв. Начинаете посимвольную запись текста в буфер, параллельно считаете буквы в словах. Как только попадается слово из нужного количества букв, устанавливаете флагу значение и ждёте конца предложения. Нашли конец, добавили в буфер символ конца строки и вывели его на экран. Итератор буфера устанавливаете в начало. Флагу присваиваете ноль. Если флаг равен нулю и достигнут конец предложения, итератор буфера возвращается в исходное состояние, его отсчёт начинается с первого значимого символа.
Как-то так.
Анатолий Гарин
Анатолий Гарин
99 724
Лучший ответ
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include<math.h>
#define MaxPr 30
#define MinPr 20
#define MaxWr 10
#define MinWr 1
#define MaxWd 7
#define MinWd 1
#define MaxSp 3
#define MinSp 1
int main()
{
int j,i,k,t,size,Ww,Pr,iZn,z,s;
srand(time(NULL));
char e[6][4]={"!!!","!!","!?","?","!","."};
int P=rand() % (MaxPr-MinPr) + MinPr;
int* S=(int*)malloc(P*sizeof(int));
for(i=0;i-P;i++) S[ i ]=rand() % (MaxWr-MinWr) + MinWr,size;
for(size=1,i=0;i-P;i++) size+=((MaxWd+3)*S[ i ]+3)*P;
char* p=(char*)malloc(size);
int b;
for(t=i=0;i-P;i++)
{
for(j=0;j-S[ i ];j++)
{
for(k=0,Ww=rand() % (MaxWr-MinWr) + MinWr;k-Ww;k++) p[t++]=char(rand() % ('z'-'a')+'a');
if(j!=S[ i ]-1) for(k=0,Pr=3-int(log10(rand() % 999+1.));k-Pr;k++) p[t++]=' ';
}
for(iZn=rand() % 126+2,iZn=log(float(iZn))/log(2.)-1,j=0;e[iZn][j];j++) p[t++]=e[iZn][j];
for(j=0,Pr=3-int(log10(rand() % 999+1.));j-Pr;j++) p[t++]=' ';
}
p[t]=0,printf("%s\n\n",p);

for(z=t=Pr=iZn=Ww=i=0;p[ i ];i++)
{
if(p[ i ]==63||p[ i ]==46||p[ i ]==33||p[ i ]==32) { if(Pr==7) iZn=1; Pr=0; } else Pr++;
if(p[ i ]==63||p[ i ]==46||p[ i ]==33)
{
if(++z==2)
{
for(s=0,j=Ww;j < i;j++) if(p[j]==63||p[j]==46||p[j]==33||p[j]==32) { if(Pr==1) s++; Pr=0; } else Pr++;
}
if(iZn)
{
printf("%d: ",t++);
for(iZn=0,j=Ww;j < i;j++) printf("%c",p[j]);
for(;p[ i ]==63||p[ i ]==46||p[ i ]==33||p[ i ]==32;printf("%c",p[i++]));
printf("\n");
}
else
for(;p[ i ]==63||p[ i ]==46||p[ i ]==33||p[ i ]==32;i++);
Ww=i--;
}
}
printf("in 2-d count: %d\n",s);
free(p);
free(S);
return 0;
}
Иван Ильченко
Иван Ильченко
76 473
калёк может код набросаешь?