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

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

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

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

Q&A

解決済

2回答

1409閲覧

C言語プログラム正しく実行できない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/01/23 09:15

編集2019/01/24 03:35

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 8 9int main( int argc, char *argv[] ) 10{ 11 if(argc>9) { 12 printf("Illegal number of argument.\n"); 13 return(-1); 14 } 15 int k,a; 16 17 for(k=1; k<argc; k++){ 18 19 get_Greek_Mathsymbol(argv[k]); 20 get_Lgreek(argv[k]); 21 get_Subscript(argv[k]); 22 get_Superscript(argv[k]); 23 24 } 25 26for(a=1; a<=argc; a++){ 27printf("%s\n", argv[a]); 28} 29return 0; 30} 31 32void get_Greek_Mathsymbol(char *arg){ 33 34char greek[][10] = {"alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega", "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi", "Sigma", "Upsilon", "Phi", "Psi", "Omega" "geq", "leq"}; 35 36static int Cnt1 = 0; 37int cnt1 = 0; 38 39if(*arg == '\' ) 40{ arg++; 41while(*arg != '\0'){ // これをすべての文字についてループ 42 43 44if(*arg != greek[Cnt1][cnt1]){ 45 break; 46} 47else if((*(arg+1) == '\0') || (*(arg+1) == '_') || (*(arg+1) == '^')){ 48 *(arg-cnt1-1) = '&'; 49 if(*arg == 'q'){ 50 *arg = '\0'; 51 } 52} 53 54else{ 55 arg++, cnt1++; 56 continue; 57} 58 59} 60 61} 62Cnt1++; 63} 64 65void get_Lgreek(char *arg){ 66 67char Greek[][10] = {"Alpha", "Beta", "Gamma", "Epsilon", "Zeta", "Eta", "Iota", "Kappa", "Mu", "Nu", "Rho", "Tau", "Chi", "omicron"}; 68static int Cnt2 = 0; 69int i = 0; 70 71if((*arg == Greek[Cnt2][0]) && ((*(arg+1) == '\0') || (*(arg+1) == '_') || (*(arg+1) == '^'))){ 72 *arg = '&'; 73 arg++; 74while(Greek[Cnt2][i] != '\0'){ 75 *arg = Greek[Cnt2][i]; 76 arg++ ,i++; 77 } 78} 79Cnt2++; 80} 81 82 83 84 85 86 87 88 89void get_Subscript(char *arg){ 90 char rest1[10] ; 91 int i, j, l, m; 92 int cnt2 = 0; 93 char subscript[][10] = {"<sub>", "</sub>"}; 94 95 if(*arg == '_'){ 96 arg++; 97 for(i=0; i<=9; i++){ 98 99 if((*arg == '\0') || (*arg == '^')){ 100 break; 101 } 102 rest1[i] = *arg; 103 arg++, cnt2++; 104 } 105 106 107 108for(j=0; subscript[0][j] != '\0'; j++){ 109*(arg-cnt2-1+j) = subscript[0][j]; 110} 111for(l=0; l<cnt2; l++){ 112*(arg-cnt2+4+l) = rest1[l]; 113} 114for(m=0; subscript[1][m] != '\0'; m++){ 115*(arg+4+m) = subscript[1][m]; 116} 117 } 118else{ 119 arg++; 120 } 121 122 123 124 } 125 126void get_Superscript(char *arg){ 127 char rest2[10] ; 128 int i, j, l, m; 129 int cnt3 = 0; 130 char *superscript[] = {"<sup>", "</sup>"}; 131 if(*arg == '_'){ 132 arg++; 133 for(i=0; i<=9; i++){ 134 135 if(*arg == '\0'){ 136 break; 137 } 138 rest2[i] = *arg; 139 arg++, cnt3++; 140 } 141 142 143 144 for(j=0; superscript[0][j] != '\0'; j++){ 145 *(arg-cnt3-1+j) = superscript[0][j]; 146 } 147 for(l=0; l<cnt3; l++){ 148 *(arg-cnt3+4+l) = rest2[l]; 149 } 150 for(m=0; superscript[1][m] != '\0'; m++){ 151 *(arg+4+m) = superscript[1][m]; 152 153 } 154 } 155 else{ 156 arg++; 157 } 158}

実現したいこと
このコードはなぜ実行できないのでしょうか?
TeXの数式モードで書かれた文字列を与え、HTMLに変換するプログラムを作成するという問題です。
どのように修正すれば実行できるでしょうか?
\alphaなら&alpha
Aなら&Alpha
x_1^2ならx<sub>1</sub><sup>2</sup>みたいな感じです

発生している問題・エラーメッセージ
eclispeではエラーはでるのですが、例えばコマンドライン引数を、\alpha \beta x_1^2 とした場合、結果は
alpha beta x_1^2 と入力のままになります。

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

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

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

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

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

y_waiwai

2019/01/23 09:47

実行できないとはどういうふうになるんでしょうか。 エラーメッセージが出るならそれを提示しましょう また、このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
退会済みユーザー

退会済みユーザー

2019/01/24 03:31

申し訳ありませんでした。修正しました。
guest

回答2

0

ベストアンサー

ざっと見た限りですが、少なくとも以下の箇所は修正の必要があります。

  • ローカル変数が全く初期化されていない。
    --> 初期値は保証されません。
  • main()の引数である argv[] の内容を編集している。
    --> 編集した場合、結果は保証されません。

また、コードをアップする際に、もう少し、インデントとか、綺麗にできませんか?

[追記]
bellsmarketさんの回答で、変数の初期化はいくつか修正されたようですが、十分でしょうか?
(できれば、質問のコードを修正)

*以下のように、同じ場所に何度も代入している箇所があります。 (複数)

C

1for(l=0; l<cnt2; l++){ 2*(arg-cnt2+4) = rest1[l]; 3}

投稿2019/01/23 13:21

編集2019/01/23 14:42
pepperleaf

総合スコア6383

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

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

退会済みユーザー

退会済みユーザー

2019/01/23 13:44

コードの件はすみませんでした。 argvの内容を編集した場合、結果は保証されないとは具体的にどういうことでしょうか?
pepperleaf

2019/01/23 14:32

argvは、プログラム実行時に システムから、渡されるもので、参照することのみを想定しているからです。 また、argvで渡される文字列は、最小限なので、サイズを越えての書き込みは、問題を起こす可能性がある。ということです。 例えば、引数として "abc", "def", "efg" が渡されたとした時、"abc"の文字列を "123456" と書き換えると、次の "def"を書き換える可能性が大きいです。 以前、あるシステムで調べたとき、上記の引数は、 "abc\0def\0efg"のように格納されていました (ただし、システム依存)
退会済みユーザー

退会済みユーザー

2019/01/24 00:12

返信ありがとうございます。 このような入力文字列を書き換える問題の場合はscanfで二次元配列に文字列を格納して、それを書き換えるといったやり方が正しいのでしょうか? 何かうまいやり方はないでしょうか? お手数かけてすみません。
pepperleaf

2019/01/24 13:52

入力文字列用にバッファ、、例えば、 char arg1[100]; (最大 99文字までの場合)とか用意して、strcpy(arg1, argv[1]); のようにコピーして使いましょう。 C言語は、この辺の文字列の扱いが弱いので注意が必要。
退会済みユーザー

退会済みユーザー

2019/01/26 12:42

#include 〈stdio.h〉のみしか使えない場合に、複数の文字列を書き換えたい場合は、 どのようになりますかね? 時間を取らせてしまってすみません。 複数の文字列を受け取る前提でお願いします。 またある関数内でその文字列を書き換えたい場合、仮引数はどのうよに記述すればよいでしょうか?
pepperleaf

2019/01/26 12:50

#include <string.h> が使えないという事ですか? 単に char *strcpy(char *dst, char *src); を宣言すれば、使えますが、、 これもダメなら、 while (*src != '\0') *dst++ = *src++; // dst がコピー先、 srcがコピー元 でコピーしても済むと思います。(効率はともかく)
guest

0

ソースコードはじっくり動作分析はしていませんが、エラーは下記で出るようです。
・ライブラリの読み込みに#が付いていない
・変数の初期化をしていない

修正前ソースコード

c

1include <stdio.h> 2include <stdlib.h>//2行目 3int cnt1; //36行目 4int i; //67行目 5int cnt2; //82行目 6int cnt3; //114行目

↓↓↓↓↓↓↓↓↓↓

修正後のソースコード

c

1#include <stdio.h> //1行目 2#include <stdlib.h> //2行目 3int cnt1 = 0; //36行目 4int i = 0; //67行目 5int cnt2 = 0; //82行目 6int cnt3 = 0; //114行目

投稿2019/01/23 10:45

編集2019/01/23 10:46
bellsmarket

総合スコア62

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

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

退会済みユーザー

退会済みユーザー

2019/01/23 11:38

直して実行してみましたが問題は解決できませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問