Advertisement
2607

10nov_new

Nov 10th, 2021
909
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. // целое число в строку
  7. char* IntStr(char *buf, int n, char flag, char flag3, int width);
  8. // вещественное число в строку
  9. char* DoubleStr(char *buf, double n, char flag);
  10. char* Int8Str(char *buf, int n);
  11. int LenInt(int n);
  12. int Len8Int(int n, int base);
  13. int LenDouble(double n);
  14. int subspecifier(char *str, int p);
  15. char *convert(unsigned int num, int base, int symb, char flag2, char flag3, int width);
  16.  
  17. void f_b(char *str, ...)
  18. {
  19.   va_list ap;             /* point on next unnamed argument */
  20.   va_start(ap, str); /* set 'ap' on 1-st unnamed argument */
  21.   char *t = str;
  22.   char output[100] ="";
  23.   for (char *p = str; *p; p++)
  24.   {
  25.     //int curr = p - t;
  26.     //printf("%d\n" , curr);
  27.     if (*p !='%')
  28.     {
  29.       putchar(*p);
  30.       //output[strlen(output)] = *p;
  31.       output[strlen(output)] = *p;
  32.       //printf("^^^%c^^^\n", t);
  33.       continue;
  34.     }
  35.     char flag1 = -1;
  36.     char flag2 = -1;
  37.     char flag3 = -1;
  38.     int width = -1;
  39.     int prec = -1;
  40.  
  41.     /*
  42.     // if ((*p == '-' || *p == '+' || *p == ' ' || *p == '#' || *p == '0') && *(p+1) == )
  43.     if (*(p+1) != 'c' && *(p+1) != 'd' && *(p+1) != 'i' && *(p+1) != 'e' && *(p+1) != 'E' && *(p+1) != 'f' && *(p+1) != 'g' && *(p+1) != 'G' && *(p+1) != 'o' && *(p+1) != 's' && *(p+1) != 'u' && *(p+1) != 'x' && *(p+1) != 'X' && *(p+1) != 'p' && *(p+1) != 'n' && *(p+1) != '%') {
  44.       ++p;
  45.       char char1 = *p;
  46.       printf("%c", char1);
  47.     }
  48.     */
  49.     //printf("%c", *p);
  50.     //if (subspecifier(str, *(p+1)) ==1) {
  51.     //  p++;
  52.     //}
  53.     ++p;
  54.     while(1) {
  55.         if (*p == '-' || *p == '+' || *p == ' ' || *p == '#' || *p == '0') {
  56.           if (*p == '+' || *p == ' ') {
  57.               flag1 = *p;
  58.               printf("%c", flag1);
  59.           }
  60.           if (*p == '#'){
  61.               flag2 = *p;
  62.               printf("%c", flag2);
  63.           }
  64.           if (*p == '0' || *p == '-'){
  65.               flag3 = *p;
  66.               printf("%c", flag3);
  67.           }
  68.           ++p;
  69.         } else {
  70.           break;
  71.         }
  72.     }
  73.     if (*p == '*') {
  74.       width = va_arg(ap, int);
  75.       printf("!%d!", width);
  76.       ++p;
  77.     }
  78.  
  79.     if(*p == '.' && *(p+1) == '*') {
  80.       prec = va_arg(ap, int);
  81.       printf("!%d!", prec);
  82.       p+=2;
  83.     }
  84.    
  85.     switch(*p)
  86.     {
  87.       case 'c':
  88.       {
  89.         char ival;
  90.         ival = (char) va_arg(ap, int);
  91.         printf ("%c", ival);
  92.         //strcat(output, ival);
  93.         if (width != -1){
  94.           for (int i = 0; i < width - 1; ++i)
  95.             output[strlen(output)] = ' ';
  96.         }
  97.         output[strlen(output)] = ival;
  98.         break;
  99.       }
  100.       case 'd':
  101.       {
  102.         int ival = 0;
  103.         ival = va_arg(ap, int);
  104.         char buf[21]="";
  105.         IntStr(buf, ival, flag1, flag3, width);
  106.         printf("%s", buf);
  107.         strcat(output, buf);
  108.         break;
  109.       }
  110.       case 'i':
  111.       {
  112.           int ival = 0;
  113.           ival = va_arg(ap, int);
  114.           char buff[21]="";
  115.           IntStr(buff, ival, flag1, flag3, width);
  116.           printf("%s", buff);
  117.           strcat(output, buff);
  118.           break;
  119.       }
  120.       case 'f':
  121.       {
  122.         double dval = 0.;
  123.         dval = va_arg(ap, double);
  124.         char buf[21]="";
  125.         DoubleStr(buf, dval, flag1);
  126.         printf("%s", buf);
  127.         strcat(output, buf);
  128.         break;
  129.       }
  130.       case 'o':
  131.       {
  132.           int ival = 0;
  133.           ival = va_arg(ap, int);
  134.           int len = Len8Int(ival , 8);
  135.           printf("%s", convert(ival, 8, 1, flag2, flag3, width));
  136.           strcat(output, convert(ival, 8, 1, flag2, flag3, width));
  137.           break;
  138.       }
  139.       case 'x':
  140.       {
  141.         int ival = 0;
  142.           ival = va_arg(ap, int);
  143.           int len = Len8Int(ival , 16);
  144.           printf("%s", convert(ival, 16, 1, flag2, flag3, width));
  145.           strcat(output, convert(ival, 16, 1, flag2, flag3, width));
  146.           break;
  147.       }
  148.       case 'X':
  149.       {
  150.         int ival = 0;
  151.           ival = va_arg(ap, int);
  152.           int len = Len8Int(ival , 16);
  153.           printf("%s", convert(ival, 16, 0, flag2, flag3, width));
  154.           strcat(output, convert(ival, 16, 0, flag2, flag3, width));
  155.           break;
  156.       }
  157.       case 's':
  158.       {
  159.         char *buf = malloc(sizeof(char));
  160.         int k = 0;
  161.         for(char *sval = va_arg(ap, char *); *sval; sval++) {
  162.             k++;
  163.             if (prec < k)
  164.                 continue;
  165.             printf("%c", *sval);
  166.             //strcat(output, *sval);
  167.             buf = realloc(buf, k*sizeof(char));
  168.             *(buf+k-1)=*sval;
  169.             //output[strlen(output)] = *sval;
  170.         }
  171.         int l = strlen(buf);
  172.         if (flag3 != '-') {
  173.           for (int i = 0; i < width - l; ++i)
  174.               strcat(output, " ");
  175.         }
  176.         printf("%s", buf);
  177.         strcat(output, buf);
  178.         free(buf);
  179.         if (flag3 == '-') {
  180.           for (int i = 0; i < width - l; ++i)
  181.               strcat(output, " ");
  182.         }
  183.             // putchar(*sval);
  184.         break;
  185.       }
  186.       case 'n':
  187.       {
  188.         break;
  189.       }
  190.       case '%':
  191.       {
  192.         printf("%%");
  193.         strcat(output, "%");
  194.         break;
  195.       }
  196.       default:
  197.       {
  198.         putchar(*p);
  199.         output[strlen(output)] = *p;
  200.         break;
  201.       }
  202.     }
  203.   }
  204.   va_end(ap); /* clean all */
  205.   printf("\n");
  206.   printf("%s", output);
  207. }
  208.  
  209. int main ()
  210. {
  211.  
  212.   f_b("%*d %+*d % f %+-*d %% %n %*.*s %-#*.*o %.*i %*c %*x %#X\n",9, 28,9, -286, 4.0,6, 100,10,3, "Hello", 9, 666, 45674,333, 4, 8,'Q',7, 1023, 1023);
  213.   //f_b("%0#*x %#X\n",8, 1023, 1023);
  214. //f_b("%+d %f", 55, 4.45);
  215.   //f_b("Hello");
  216.   //f_b("%+*d",9, 28);
  217.   return 0;
  218. }
  219.  
  220.  
  221. char* IntStr(char *buf, int n, char flag, char flag3, int width) {
  222.     //char *index = buf;
  223.     int len = LenInt(n);
  224.     if (prec != -1)
  225.       len = prec;
  226.     int full_len = len;
  227.     int i = 0;
  228.     int j = 0;
  229.     //printf("@%d@", len);
  230.     if (flag == ' ' && n >= 0 || flag == '+' && n > 0 || n < 0)
  231.         full_len++;
  232.     //printf("&%d&", full_len);
  233.     if (flag3 == -1 && width != -1){
  234.         for (j; j < width - full_len; ++j) {
  235.           *(buf+j) = ' ';
  236.           //printf("(%d)", buf+j);
  237.         }
  238.     }
  239.     if (flag == ' ' && n >= 0) {
  240.       buf+=j;
  241.       *(buf++) = ' ';
  242.       buf-=j;
  243.     }
  244.     if (flag == '+' && n > 0) {
  245.       buf+=j;
  246.       *(buf++) = '+';
  247.       buf-=j;
  248.     }
  249.     if (n < 0) {
  250.       buf+=j;
  251.         *(buf++) = '-';
  252.         buf-=j;
  253.         n = -n;
  254.     }
  255.     if (n == 0) {
  256.       buf+=j;
  257.         *(buf++) ='0';
  258.         buf-=j;
  259.     }
  260.     if (flag3 == '0' && width != -1) {
  261.         for (j; j < width - full_len; ++j){
  262.           *(buf+j) = '0';
  263.         }
  264.     }
  265.     while (n > 0) {
  266.         *(buf+j+len-i-1) = (n % 10) | '0';
  267.         n /= 10;
  268.         i++;
  269.     }
  270.    
  271.     if (flag3 == '-' && width != -1) {
  272.         for (j; j < width - full_len; ++j)
  273.           *(buf+len-1+j+1) = ' ';
  274.     }
  275.     //*(buf+len) = '\0';
  276.     return(buf);
  277. }
  278.  
  279. int LenInt(int n) {
  280.     int len = 0;
  281.     if (n < 0)
  282.         n = n * (-1);
  283.     while(n > 0) {
  284.       len++;
  285.       n /= 10;
  286.     }
  287.     return len;
  288. }
  289.  
  290. int Len8Int(int n, int base) {
  291.     int len = 0;
  292.     while(n > 0) {
  293.       len++;
  294.       n /= base;
  295.     }
  296.     return len;
  297. }
  298.  
  299. char* DoubleStr(char *buf, double n, char flag) {
  300.     int len = LenInt(n);
  301.     IntStr(buf, (int)n, flag, -1, -1);
  302.     strcat(buf, ".");
  303.     if (n < 0) {
  304.       n = n * (-1);
  305.     }
  306.     n = n - (int)n;
  307.     for (int i = 0; i < 6; i++) {
  308.         n *= 10;
  309.         //char c = n + '0';
  310.         //strcat(buf, &c);
  311.         buf[strlen(buf)] = n + '0';
  312.         n = n - (int)n;
  313.     }
  314.     return buf;
  315. }
  316.  
  317. int LenDouble(double n) {
  318. }
  319.  
  320. char* Int8Str(char *buf, int n) {
  321.     //char *index = buf;
  322.     int len = Len8Int(n, 8);
  323.     int i = 0;
  324.     if (n < 0) {
  325.         *buf++ = '-';
  326.         n = -n;
  327.     }
  328.     while (n > 0) {
  329.         *(buf+len-i-1) = (n % 8) | '0';
  330.         n /= 8;
  331.         i++;
  332.     }
  333.     *(buf+len) = '\0';
  334.     return(buf);
  335. }
  336.  
  337. int subspecifier(char *str, int p) {
  338.   int f = 0;
  339.   if (p != 'c' && p != 'd' && p != 'i' && p != 'e' && p != 'E' && p != 'f' && p != 'g' && p != 'G' && p != 'o' && p != 's' && p != 'u' && p != 'x' && p != 'X' && p != 'p' && p != 'n' && p != '%') {
  340.       f = 1;
  341.       printf("%c", p);
  342.     }
  343.   return f;
  344. }
  345.  
  346. char *convert(unsigned int num, int base, int symb, char flag2, char flag3, int width)
  347. {
  348.     //printf("#%d#", width);
  349.     printf("%d", flag3);
  350.     static char Representation[] = "0123456789ABCDEF";
  351.     static char Representation1[] = "0123456789abcdef";
  352.     static char buffer[50];
  353.     char *ptr;
  354.  
  355.     ptr = &buffer[49];
  356.     *ptr = '\0';
  357.     int len = Len8Int(num , base);
  358.     printf("len=%d", len);
  359.     if (flag2 == '#') {
  360.       if (base == 8)
  361.         len+=1;
  362.       else if (base == 16)
  363.         len+=2;
  364.     }
  365.     if (flag3 == '-' && width != -1) {
  366.       printf("$%d$", width);
  367.       for (int i = 0; i < width - len; ++i)
  368.         *--ptr = ' ';
  369.     }
  370.     do
  371.     {
  372.       if (symb == 0)
  373.         *--ptr = Representation[num%base];
  374.       else
  375.         *--ptr = Representation1[num%base];
  376.         num /= base;
  377.     }while(num != 0);
  378.     if (flag3 == '0' && width != -1) {
  379.       printf("$%d$", width);
  380.       for (int i = 0; i < width - len; ++i)
  381.         *--ptr = '0';
  382.     }
  383.     if (flag2 == '#') {
  384.         if (base == 8) {
  385.           *--ptr = '0';
  386.         } else if (base == 16 && symb == 0){
  387.           *--ptr = 'X';
  388.           *--ptr = '0';
  389.         } else if (base == 16 && symb == 1){
  390.           *--ptr = 'x';
  391.           *--ptr = '0';
  392.         }
  393.         }
  394.     if (flag3 == -1 && width != -1) {
  395.       printf("$%d$", width);
  396.       for (int i = 0; i < width - len; ++i)
  397.         *--ptr = ' ';
  398.     }
  399.  return(ptr);
  400. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement