Хрестоматия по программированию на Си в Unix




Примеры. Хрестоматия по программированию на Си в Unix


Пример 5

/* Программа, распечатывающая слова в строках файла в обратном порядке */

#include <stdio.h>

#include <ctype.h>

#include <string.h>

#include <locale.h>

#define MAXL 255 /* макс. длина строки */

/* Если бы мы не включили ctype.h, то мы должны были бы определить * #define isspace(c) ((c) == ' ' (c) == '\t' (c) == '\f') */ main ( argc, argv ) char **argv;{ setlocale(LC_ALL, ""); if( argc == 1 ){ /* программа вызвана без аргументов */ munch( "" ); }else{ /* аргументы программы - имена файлов */ while( argv[ 1 ] ){ munch( argv[1] ); argv++; argc--; } } total(); exit(0); }

/* обработать файл с именем name */ munch( name ) char *name; { char l[MAXL]; /* буфер для очередной строки */ int len; /* длина этой строки */ char *words[50]; /* таблица полей строки */ char **s; /* служебная */ int nwords; /* число слов в строке */

FILE *fp;

if( name == NULL !*name ) fp = stdin; /* стандартный ввод */ else if( (fp = fopen( name, "r" )) == NULL ){ fprintf( stderr, "Не могу открыть файл %s\n", name ); return; }

printf( "----------------------------%s----\n", name ); while( fgets( l, MAXL, fp ) != NULL ){ len = strlen( l ); if( len && l[len-1] == '\n' ) l[--len] = '\0' ;

if( nwords = parse( l, words)){ /* распечатка слов в обратном порядке */ for( --nwords; nwords >= 0; nwords-- ){ printf( "%s ", words[ nwords] ); add( words[ nwords ] ); } } putchar ('\n'); } if( fp != stdin ) fclose( fp ); }

/* разобрать строку на слова */ parse( s, tabl ) register unsigned char *s; unsigned char *tabl[]; { char eol = 0; int nwords = 0;

while ( !eol ){

/* пропустить пробелы и табуляции */ while(isspace(*s)) s++;

if( !*s ) /* строка кончилась */ break;

*tabl++ = s; nwords++; /* начало очередного слова */

/* пока не пробел и не конец строки */ while( *s && !isspace(*s))s++;

/* указатель стоит на символе, следующем за словом */ if( ! *s ) eol ++;

*s = '\0'; /* закрыли Слово, начинаем Дело */ s++; }




Содержание  Назад  Вперед