Untitled
unknown
plain_text
a year ago
4.4 kB
14
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