Untitled

 avatar
unknown
plain_text
7 months ago
4.4 kB
11
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define N 202
#define L 10010

void prin_args(char state[], char args[], char ans[])
{
    int cursor = 0, idx = 0, flag = 0;

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

                        //printf("args[cursor] = %c\n", args[cursor]);

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

                        cursor += 2;
                        //printf("args[cursor] = %c\n", args[cursor]);

                        i += 1;
                        break;
                    }

                    cursor++;
                }
                //printf("ans : %s\n", ans);
            }
            else if(state[i+1] == 'c')
            {
                for(int j = cursor;j<cursor+4;j++)
                {
                    if(isalpha(args[j]))
                    {
                        ans[idx++] = args[j];
                        break;
                    }
                }

                i += 1;
                cursor += 5;
                //printf("args[cursor] = %c\n", args[cursor]);

                //printf("ans : %s\n", ans);
            }

        }
        else
        {
            ans[idx++] = state[i];
            //printf("ans : %s\n", ans);
        }
    }

    ans[idx] = '\0';
}
int forloop_num(char input[])
{
    int num1 = 0, num2 = 0, flag = 1;

    for(int i = 0;input[i] != '\0';i++)
    {
        if(isdigit(input[i]))
        {
            if(flag == 1)
                num1 = num1*10 + (input[i] - '0');
            else
                num2 = num2*10 + (input[i] - '0');
        }
        else if(input[i] == '<')
        {
            flag = 0;
        }
        else if(num2 > 0)
        {
            printf("n = %d\n", num2-num1);

            return (num2-num1);
        }
    }
}
void find_args(char str[], char args[])//擷取參數部分
{
    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';
}
bool have_args(char input[])
{
    if(strchr(input, '%') == NULL)
        return false;
    else
        return true;
}
void check_and_print(char input[])
{
    char ans[L], tmp[L];
    char s[L];

    strcpy(tmp, input);
    char *token = strtok(tmp, "(");

    if(strcmp(token, "printf") == 0)
    {
        if(!have_args(input))//no args
        {
            char *s1 = strtok(NULL, "\"");//切敘述句
            printf("%s\n", s1);
        }
        else//have args
        {
            char *s1 = strtok(NULL, "\"");//切敘述句
            find_args(input, s);//找參數句

            prin_args(s1, s, ans);
            printf("%s\n", ans);
        }
    }
    else if(strcmp(token, "for") == 0)
    {
        int n = forloop_num(input);

        if(!have_args(input))
        {
            char *s1 = strtok(NULL, "(");
            char *s2 = strtok(NULL, "\"");//切敘述句

            for(int i = 0;i<n;i++)
            {
                printf("%s", s2);
            }
            printf("\n");
        }
        else
        {
            char *s1 = strtok(NULL, "(");
            //printf("s1 : %s\n", s1);
            char *s2 = strtok(NULL, "\"");//切敘述句
            //printf("s2 : %s\n", s2);

            find_args(input, s);//找參數句
            //printf("s : %s\n", s);

            prin_args(s2, s, ans);

            for(int i = 0;i<n;i++)
            {
                printf("%s", ans);
            }
            printf("\n");
        }
    }
}
int main(void)
{
    int T;
    char str[N][L];

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

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

        str[i][strcspn(str[i], "\n")] = '\0';

        check_and_print(str[i]);
    }

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