前提・実現したいこと
c言語を用いてtexの数式モードであらわされたものをhtmlの数式に変換するというプログラムを作成しています
条件はギリシャ文字と上付き、下付き文字の変換ですなぜうまくいかないのでしょうか。
また、この機能を実現したいとき、どのようなコードを書けばよいのでしょうか
発生している問題・エラーメッセージ
\alpha x_1とコマンドラインで実行すると &alpha x<sub>1</sub>と出力してほしいが alpha x_1という出力結果になる そもそもこのコードは欠陥が多い気がします
該当のソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3void get_Greek_Mathsymbol(char *arg); 4void get_Lgreek(char *arg); 5void get_Subscript(char *arg); 6void get_Superscript(char *arg); 7 8int main(int argc, char *argv[]) { 9 if (argc > 9) { 10 printf("Illegal number of argument.\n"); 11 return (-1); 12 } 13 int k, a; 14 15 for (k = 1; k < argc; k++) { 16 17 get_Greek_Mathsymbol(argv[k]); 18 get_Lgreek(argv[k]); 19 get_Subscript(argv[k]); 20 get_Superscript(argv[k]); 21 22 } 23 24 for (a = 1; a <= argc; a++) { 25 printf("%s\n", argv[a]); 26 } 27 return 0; 28} 29 30void get_Greek_Mathsymbol(char *arg) { 31 32 char greek[][10] = { "alpha", "beta", "gamma", "delta", "epsilon", "zeta", 33 "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "pi", 34 "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega", 35 "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi", "Sigma", "Upsilon", 36 "Phi", "Psi", "Omega" "geq", "leq" }; 37 38 static int Cnt1 = 0; 39 int cnt1 = 0; 40 41 if (*arg == '\') { 42 arg++; 43 while (*arg != '\0') { // これをすべての文字についてループ 44 45 if (*arg != greek[Cnt1][cnt1]) { 46 break; 47 } else if ((*(arg + 1) == '\0') || (*(arg + 1) == '_') 48 || (*(arg + 1) == '^')) { 49 *(arg - cnt1 - 1) = '&'; 50 if (*arg == 'q') { 51 *arg = '\0'; 52 } 53 } 54 55 else { 56 arg++, cnt1++; 57 continue; 58 } 59 60 } 61 62 } 63 Cnt1++; 64} 65 66void get_Lgreek(char *arg) { 67 68 char Greek[][10] = { "Alpha", "Beta", "Gamma", "Epsilon", "Zeta", "Eta", 69 "Iota", "Kappa", "Mu", "Nu", "Rho", "Tau", "Chi", "omicron" }; 70 static int Cnt2 = 0; 71 int i = 0; 72 73 if ((*arg == Greek[Cnt2][0]) 74 && ((*(arg + 1) == '\0') || (*(arg + 1) == '_') 75 || (*(arg + 1) == '^'))) { 76 *arg = '&'; 77 arg++; 78 while (Greek[Cnt2][i] != '\0') { 79 *arg = Greek[Cnt2][i]; 80 arg++, i++; 81 } 82 } 83 Cnt2++; 84} 85 86void get_Subscript(char *arg) { 87 char rest1[10]; 88 int i, j, l, m; 89 int cnt2 = 0; 90 char subscript[][10] = { "<sub>", "</sub>" }; 91 92 if (*arg == '_') { 93 arg++; 94 for (i = 0; i <= 9; i++) { 95 96 if ((*arg == '\0') || (*arg == '^')) { 97 break; 98 } 99 rest1[i] = *arg; 100 arg++, cnt2++; 101 } 102 103 for (j = 0; subscript[0][j] != '\0'; j++) { 104 *(arg - cnt2 - 1 + j) = subscript[0][j]; 105 } 106 for (l = 0; l < cnt2; l++) { 107 *(arg - cnt2 + 4 + l) = rest1[l]; 108 } 109 for (m = 0; subscript[1][m] != '\0'; m++) { 110 *(arg + 4 + m) = subscript[1][m]; 111 } 112 } else { 113 arg++; 114 } 115 116} 117 118void get_Superscript(char *arg) { 119 char rest2[10]; 120 int i, j, l, m; 121 int cnt3 = 0; 122 char *superscript[] = { "<sup>", "</sup>" }; 123 if (*arg == '_') { 124 arg++; 125 for (i = 0; i <= 9; i++) { 126 127 if (*arg == '\0') { 128 break; 129 } 130 rest2[i] = *arg; 131 arg++, cnt3++; 132 } 133 134 for (j = 0; superscript[0][j] != '\0'; j++) { 135 *(arg - cnt3 - 1 + j) = superscript[0][j]; 136 } 137 for (l = 0; l < cnt3; l++) { 138 *(arg - cnt3 + 4 + l) = rest2[l]; 139 } 140 for (m = 0; superscript[1][m] != '\0'; m++) { 141 *(arg + 4 + m) = superscript[1][m]; 142 143 } 144 } else { 145 arg++; 146 } 147} 148
試したこと
関数を一つ一つ実行しても変換がうまくいかない
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。