質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1951閲覧

texからhtmlへの変換プログラムについて

tumayouji

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/01/12 07:26

編集2021/01/17 13:02

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/01/12 09:00

具体的にどんな入出力が必要なのか書いてください。例「〜というコマンドラインで起動すると、〜という出力になるはずが、〜という出力になってしまう」。あと、コードのインデントがデタラメでひどく読み辛いので、エディタの整形機能などを使ってください。
tumayouji

2021/01/12 09:56

すみません、修正しました
guest

回答1

0

alpha x_1という出力結果になる

コードを見るとそうはならない気がします。\alpha が入力にあると永久ループになりませんか?

c

1 } else if ((*(arg + 1) == '\0') || (*(arg + 1) == '_') 2 || (*(arg + 1) == '^')) { 3 *(arg - cnt1 - 1) = '&'; 4 if (*arg == 'q') { 5 *arg = '\0'; 6 } 7 }

この条件に合うとargを変更しないのでwhileループから抜け出せません。

また、x_2 の方はget_Subscript()関数の引数argxを指しているため、何も変更されません。

ところで、

c

1int main(int argc, char *argv[]) {

main関数のargv引数はconstが付いておらず書き換え可能なのですが、文字数が増えるような変更はできません。

get_Subscript()get_Superscript()は文字数を増やそうとしているため、文字列書き換えが起きるとメモリ破壊が起きます。文字数が増えるなら、別の十分な長さのバッファを用意する必要があります。

投稿2021/01/12 13:47

int32_t

総合スコア21695

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tumayouji

2021/01/12 14:18

バッファはmain関数内に用意するということでしょうか。またループの件については理解をしました
int32_t

2021/01/12 15:06

そうですね、自分しか使わないようなプログラムなら、main内に固定長のバッファを用意してget_*()に渡せば簡単ですね。 for (k = 1; k < argc; k++) { char buffer[1024]; strlcpy(buffer, argv[k], 1024); // get_*()がどれも動かないときのため get_Greek_Mathsymbol(argv[k], buffer, 1024); get_Lgreek(argv[k], buffer, 1024); get_Subscript(argv[k], buffer, 1024); get_Superscript(argv[k], buffer, 1024); printf("%s\n", buffer); } のように。
tumayouji

2021/01/18 12:20

すみませんがループに関して、解決しません。どうしたらよいですか?
int32_t

2021/01/18 12:37

引用したifブロック内の最後に arg++; を足せば良さそうです。
tumayouji

2021/01/18 12:46

} else if ((*(arg + 1) == '\0') || (*(arg + 1) == '_') || (*(arg + 1) == '^')) { *(arg - cnt1 - 1) = '&'; if (*arg == 'q') { *arg = '\0'; } arg++; } という感じでしょうか
int32_t

2021/01/18 13:03

そうです。 ここで確認するより、自分で試して動かしたほうが早いですよ。
tumayouji

2021/01/18 13:08

そうですね、試したらうまくいきそうな挙動をしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問