В текстовом файле нужно найти самое длинное предложение - C (СИ)
Формулировка задачи:
в текстовом файле нужно найти самое длинное предложение
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "time.h"
void time_step (FILE*f)
{
time_t t;
t=time(NULL);
fprintf(f, " %s \n",ctime(&t));
}
main (int argc, char *argv[])
{
char buffer[20], ch, word[2000], N[2];
FILE *fx, *fy, *flog;
int SW, I, Pro;
printf("Kratkoe izlozhenie zadachi:\n");
printf("V tekstovom fayle nayti samoe dlinnoe predlozhenie\n");
sprintf(buffer,"%s.log",argv[0]);
if((flog=fopen(buffer,"a"))==NULL)
{
puts("Oshibka otkryitiya zhurnala");
puts("press Enter");
getchar();
exit(0);
}
time_step(flog);
fprintf(flog, "programma %s pristupila k rabote\n", argv[0]);
if (argc<4)
{
time_step(flog);
fprintf(flog, "Oshibka,nedostatochno argumentov komandnoy stroki,rabota zavershena\n", argv[0]);
fclose(flog);
printf("Oshibka,ispolzuyte %s <imya fayla> <imya fayla> \n",argv[0]);
puts("Press Enter");
getchar();
exit(0);
}
if((fx=fopen(argv[1],"r"))==NULL)
{
time_step(flog);
fprintf(flog, " Oshibka nevozmozhno otkryit vhodnoy fayl %s ", argv[1]);
printf(" %s\n", argv[1]);
printf("nevozmozhno otkryit fayl\n");
puts("press Enter");
getchar();
fclose(flog);
exit(0);
}
time_step(flog);
fprintf(flog, "fayl %s uspeshno otkryit\n",argv[1]);
if((fy=fopen(argv[2],"a"))==NULL)
{
time_step(flog);
fprintf(flog,"Oshibka nevozmozhno otkryit vhodnoy fayl %s ",argv[2]);
printf("nevozmozhno otkryit vhodnoy fayl\n");
getchar();
fclose(flog);
exit(0);
}
time_step(flog);
fprintf(flog,"fayl %s uspeshno otkryit\n",argv[2]);
sprintf(N,"%s",argv[3]);
SW=0;
while(1)
{//начало поиска
{
SW++;
}
}
fprintf(fy,"samoe dlinnoe predlozenie %s ", );
fprintf(fy,"\n");
printf("\n");
fclose(fx);
fclose(fy);
time_step(flog);
fprintf(flog,"operatsiya vyipolnena uspeshno\n%s i %s uspeshno zakryityi, programma zavershila rabotu\n",argv[1],argv[2]);
printf("operatsiya vyipolnena \n");
puts("press Enter");
getchar();
fclose(flog);
exit(0);
}Решение задачи: «В текстовом файле нужно найти самое длинное предложение»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct {
char* s;
size_t p;
size_t n;
} buf_t;
inline void buf_init(buf_t* b);
inline int buf_empty(buf_t* b);
inline char buf_at(const buf_t* b, size_t i);
inline const char* buf_str(buf_t* b);
inline size_t buf_length(const buf_t* b);
inline void buf_reset(buf_t* b);
int buf_add(buf_t* b, char c);
int buf_copy(buf_t* d, const buf_t* s);
void buf_clear(buf_t* b);
int find_maxprop(FILE* _in, buf_t* m);
int main(void){
buf_t m;
/*
работа с файлом
FILE* fp = fopen("file.txt", "rt");
buf_init(&m);
if(find_maxprop(fp, &m))
printf("find max: %s\n", buf_str(&m));
fclose(fp);
*/
buf_init(&m);
if(find_maxprop(stdin, &m))
printf("find max: %s\n", buf_str(&m));
buf_clear(&m);
return 0;
}
//найти самое длинное предложение во входном потоке
int find_maxprop(FILE* _in, buf_t* m){
int c;
buf_t b;
if((_in == NULL) || feof(_in))
return 0;
buf_init(&b);
buf_reset(m);
do {
c = fgetc(_in);
if(c == '.' || c == '!' || c == '?' || c == EOF){
if(buf_length(&b) > buf_length(m)){
if(! buf_copy(m, &b))
goto err;
}
buf_reset(&b);
} else {
if(! buf_add(&b, (char)c))
goto err;
}
} while((c != EOF) && !ferror(_in));
buf_clear(&b);
return 1;
err:
buf_clear(&b);
buf_clear(m);
return 0;
}
//--------------
int buf_add(buf_t* b, char c){
char* t;
size_t m;
if(b->s == NULL){
b->s = (char*)malloc(b->n * sizeof(char));
if(b->s == NULL)
return 0;
} else if((b->p + 1) >= b->n){
m = b->p + 1 + (b->n >> 1);
t = (char*)realloc(b->s, m * sizeof(char));
if(t == NULL)
return 0;
b->s = t;
b->n = m;
}
b->s[b->p++] = c;
return 1;
}
int buf_copy(buf_t* d, const buf_t* s){
size_t i;
int r = 1;
buf_reset(d);
for(i = 0; i < buf_length(s); ++i){
if(! buf_add(d, buf_at(s, i))){
r = 0;
break;
}
}
return r;
}
void buf_clear(buf_t* b){
if(b->s != NULL)
free(b->s);
b->s = NULL;
b->p = 0;
b->n = 32;
}
inline void buf_init(buf_t* b){
b->s = NULL;
b->p = 0;
b->n = 32;
}
inline const char* buf_str(buf_t* b){
b->s[b->p] = '\0';
return &b->s[0];
}
inline char buf_at(const buf_t* b, size_t i) { return b->s[i]; }
inline int buf_empty(buf_t* b) { return (b->s == NULL); }
inline size_t buf_length(const buf_t* b) { return b->p; }
inline void buf_reset(buf_t* b) { b->p = 0; }
Объяснение кода листинга программы
- В этом коде представлена реализация буфера в виде структуры buf_t.
- Структура buf_t содержит указатель на строку (s), индекс позиции в этой строке (p) и размер строки (n).
- Функция buf_init инициализирует буфер, устанавливая все его поля в начальные значения.
- Функция buf_add добавляет символ в буфер. Если буфер пуст, он выделяет память под буфер. Если буфер заполнен, он удваивает его размер и добавляет новый символ.
- Функция buf_copy копирует содержимое одного буфера в другой.
- Функция buf_clear освобождает память, выделенную под буфер.
- Функция find_maxprop находит самое длинное предложение во входном потоке. Она использует буфер для хранения символов, которые могут составлять предложение.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она читает следующий символ из входного потока и добавляет его в буфер.
- Если символ является знаком пунктуации, функция проверяет, является ли предложение в буфере самым длинным из всех, которые она находила до сих пор.
- Если это так, она копирует содержимое буфера в буфер, который она передает в функцию buf_str, чтобы получить строку, представляющую предложение.
- Если предложение не является самым длинным, она очищает буфер и продолжает читать входной поток.
- Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.