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

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

ただいまの
回答率

87.60%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 860
退会済みユーザー

退会済みユーザー

#include <stdio.h>
#include <stdlib.h>
void get_Greek_Mathsymbol(char *arg);
void get_Lgreek(char *arg);
void get_Subscript(char *arg);
void get_Superscript(char *arg);


int main( int argc, char *argv[] )
{
    if(argc>9) {
            printf("Illegal number of argument.\n");
            return(-1);
        }
    int k,a;

    for(k=1; k<argc; k++){

        get_Greek_Mathsymbol(argv[k]);
        get_Lgreek(argv[k]);
        get_Subscript(argv[k]);
        get_Superscript(argv[k]);

    }

for(a=1; a<=argc; a++){
printf("%s\n", argv[a]);
}
return 0;
}

void get_Greek_Mathsymbol(char *arg){

char 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"};

static int Cnt1 = 0;
int cnt1 = 0;

if(*arg == '\\' )
{ arg++;
while(*arg != '\0'){   // これをすべての文字についてループ


if(*arg != greek[Cnt1][cnt1]){
    break;
}
else if((*(arg+1) == '\0') || (*(arg+1) == '_') || (*(arg+1) == '^')){
 *(arg-cnt1-1) = '&';
 if(*arg == 'q'){
     *arg = '\0';
 }
}

else{
    arg++, cnt1++;
    continue;
}

}

}
Cnt1++;
}

void get_Lgreek(char *arg){

char Greek[][10] = {"Alpha", "Beta", "Gamma", "Epsilon", "Zeta", "Eta", "Iota", "Kappa", "Mu", "Nu", "Rho", "Tau", "Chi", "omicron"};
static int Cnt2 = 0;
int i = 0;

if((*arg == Greek[Cnt2][0]) && ((*(arg+1) == '\0') || (*(arg+1) == '_') || (*(arg+1) == '^'))){
    *arg = '&';
    arg++;
while(Greek[Cnt2][i] != '\0'){
    *arg = Greek[Cnt2][i];
    arg++ ,i++;
    }
}
Cnt2++;
}








void get_Subscript(char *arg){
    char rest1[10] ;
    int i, j, l, m;
        int cnt2 = 0;
    char subscript[][10] = {"<sub>", "</sub>"};

    if(*arg == '_'){
        arg++;
        for(i=0; i<=9; i++){

        if((*arg == '\0') || (*arg == '^')){
            break;
        }
        rest1[i] = *arg;
        arg++, cnt2++;
    }



for(j=0; subscript[0][j] != '\0'; j++){
*(arg-cnt2-1+j) = subscript[0][j];
}
for(l=0; l<cnt2; l++){
*(arg-cnt2+4+l) = rest1[l];
}
for(m=0; subscript[1][m] != '\0'; m++){
*(arg+4+m) =     subscript[1][m];
}
    }
else{
        arg++;
    }



    }

void get_Superscript(char *arg){
    char rest2[10] ;
     int i, j, l, m;
     int cnt3 = 0;
     char *superscript[] = {"<sup>", "</sup>"};
        if(*arg == '_'){
            arg++;
        for(i=0; i<=9; i++){

        if(*arg == '\0'){
            break;
            }
            rest2[i] = *arg;
            arg++, cnt3++;
        }



    for(j=0; superscript[0][j] != '\0'; j++){
    *(arg-cnt3-1+j) = superscript[0][j];
    }
    for(l=0; l<cnt3; l++){
    *(arg-cnt3+4+l) = rest2[l];
    }
    for(m=0; superscript[1][m] != '\0'; m++){
    *(arg+4+m) =     superscript[1][m];

    }
        }
    else{
                arg++;
            }
}


実現したいこと
このコードはなぜ実行できないのでしょうか?
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 と入力のままになります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/01/23 18:47

    実行できないとはどういうふうになるんでしょうか。
    エラーメッセージが出るならそれを提示しましょう

    また、このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/01/24 12:31

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/24 22:52

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

    キャンセル

  • 2019/01/26 21:42

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

    キャンセル

  • 2019/01/26 21:50

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

    でコピーしても済むと思います。(効率はともかく)

    キャンセル

0

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

修正前ソースコード

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


↓↓↓↓↓↓↓↓↓↓

修正後のソースコード

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/23 20:38

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

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る