Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. /*Напишите программу, которая будет выводить последние N строк входного потока.
  2. Значение N по умолчанию – 10*/
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAXLINES        1024
  7. #define MAXINPUT        10240
  8. #define DEF_NUM_LINES   10
  9.  
  10. int  getlines   (char *);
  11. void parse_args (int, char **);
  12.  
  13. char  linestr[MAXINPUT];
  14. char *lineptr[MAXLINES];
  15.  
  16. int num_of_lines = DEF_NUM_LINES;
  17.  
  18. int main (int argc, char *argv[]) {
  19.         int lines;
  20.         int ltp = 0;
  21.         int i; int c;
  22.  
  23.         *lineptr = linestr;
  24.  
  25.         if (argc > 1) {
  26.                 parse_args(argc, argv);
  27.         }
  28.         lines = getlines(linestr);
  29.  
  30.         if (num_of_lines == 0) {
  31.                 num_of_lines = 10;
  32.         }
  33.  
  34.         ltp = lines < num_of_lines ? lines : num_of_lines;
  35.         printf ("\n>>> Printing %d line(s):\n", ltp);
  36.         if (ltp == DEF_NUM_LINES) {
  37.                 printf (">>> The default number of lines to print is ");
  38.                 printf ("%d\n", DEF_NUM_LINES);
  39.         }
  40.         printf ("\n");
  41.  
  42.         for (i = lines; i > 0; i--) {
  43.                 while ((c = *lineptr[0]++) != '\n') {
  44.                         if (i <= ltp) {
  45.                                 printf ("%c", c);
  46.                         }
  47.                 }
  48.                 if (c == '\n' && i <= ltp) {
  49.                         printf ("\n");
  50.                 }
  51.         }
  52.  
  53.         return 0;
  54. }
  55.  
  56. int getlines (char *buffer) {
  57.         int i, count = 0;
  58.         char c;
  59.  
  60.         for (i = 0; (c = getchar()) != EOF && i < MAXINPUT; i++) {
  61.                 *buffer++ = c;
  62.                 if (c == '\n') {
  63.                         lineptr[++count] = buffer;
  64.                 }
  65.  
  66.         }
  67.         *buffer++ = '\0';
  68.  
  69.         return count;
  70. }
  71.  
  72. void parse_args (int argc, char **argv) {
  73.         char c;
  74.  
  75.         while (--argc > 0 && (*++argv)[0] == '-') {
  76.                 c = *++argv[0];
  77.                 switch (c) {
  78.                 case 'n':
  79.                         num_of_lines = atoi(*(argv + 1));
  80.                         break;
  81.                 }
  82.         }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement