Untitled

 avatar
unknown
plain_text
5 months ago
3.2 kB
2
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 202
#define L 10010

void find_args(char str[], char args[])//擷取參數部分
{
    memset(args, 0, L);
    int num = 0, idx = 0;
    for(int i = 0;str[i] != '\0';i++)
    {
        if(str[i] == '"')
        {
            num++;
        }
        else if(num == 2)
        {
            args[idx++] = str[i];
        }
    }
    args[idx] = '\0';
}
char prin(char input[], char ans[])
{
    char temp[L];
    strcpy(temp, input);
    char *token = strtok(temp, "(");


    if(strcmp(token, "printf") == 0)
    {
        int idx = 0, cursor = 0, flag = 0;
        char *format = strtok(NULL, "\""); //I2P1 is very %d%c for me.

        char args[L];
        find_args(input, args);//, 1, 'z'

        for(int i = 0;format[i] != '\0';i++)
        {
            if(format[i] == '%')
            {
                if(format[i+1] == 'd')
                {
                    for(int j = cursor;args[j] != '\0';j++)
                    {
                        if(isdigit(args[j]))
                        {
                            ans[idx++] = args[j];

                            flag = 1;
                        }
                        else if(flag)
                        {
                            flag = 0;

                            cursor += 2;
                            i += 1;
                            break;
                        }

                        cursor++;
                    }
                }
                else if(format[i+1] == 'c')
                {
                    if(args[cursor] == '\'' && args[cursor+2] == '\'')
                    {
                        ans[idx++] = args[cursor+1];
                    }

                    i += 1;

                    cursor += 5;
                }

            }
            else
            {
                ans[idx++] = format[i];
            }
        }

        ans[idx] = '\0';
        printf("%s\n", ans);
    }

    else if(strcmp(token, "for") == 0)
    {
        int num1 = 0, num2 = 0, flag = 1;

        for(int i = 0;input[i] != '\0';i++)
        {
            if(isdigit(input[i]) && flag == 1)
            {
                num1 = num1*10 + (input[i] - '0');
            }
            else if(isdigit(input[i]) && flag == 0)
            {
                num2 = num2*10 + (input[i] - '0');
            }
            else if(num1 > 0)
            {
                flag = 0;
            }
        }

        char temp1[L];
        strcpy(temp1, input);

        char *s1 = strtok(temp1, "\"");
        char *s2 = strtok(NULL, "\"");

        for(int i = 0;i<num2-num1;i++)
        {
            printf("%s", s2);
        }
        printf("\n");

    }
}

int main(void)
{
    int n;
    char str[N][L];

    scanf("%d\n", &n);

    for(int i = 0;i<n;i++)
    {
        char ans[L];
        
        fgets(str[i], L, stdin);

        str[i][strcspn(str[i], "\n")] = '\0';//將'\n'改為'\0'

        prin(str[i], ans);
    }

    return 0;
}
Editor is loading...
Leave a Comment