Untitled
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