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

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

ただいまの
回答率

89.63%

list11_1a.c,list11_2a.cの分割コンパイルでデバッグでステップbyステップで様子が見たい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 329

sanchu52

score 176

list11_1a.c,list11_2a.cのファイルを分割コンパイルして、実行しているんですが
正常に動作しているんですが、コードの実行過程をデバッグでステップを1つ1つ見たいのですが。123abを打ち込む画面が出ないので、教えてもらえますか。
それと123からabと変わるところがよくわかりません。よろしくお願いいたします。
7時間ぐらい格闘して、123の表示までは分かっているとおもいます。つぎのabの表示に
切り替わるところがこんがらがっています。

list11_1a.cのreturn (getchar());で123abと打ち込んで

コード
//1文字入出力ライブラリ list11_1a.c
#include  <stdio.h>

#define    BUFSIZE        256                // バッファの大きさ 

char  buffer[BUFSIZE];                // バッファ 
int      buf_no = 0;                    // 現在の要素数 
int      front_ptr = 0;                // 先頭要素カーソル 
int      rear_ptr = 0;                    // 末尾要素カーソル 

//--- 1文字取り出す ---
int getchr(void)
{
    if (buf_no <= 0)                // バッファが空であれば 
        return (getchar());            // キーボードから読み込んで返す 

    else {
        int     temp;
        buf_no--;
        temp = buffer[front_ptr++];
        if (front_ptr == BUFSIZE)
            front_ptr = 0;
        return (temp);
    }
}

//--- 1文字押し戻す ---
int ungetchr(int ch)
{
    if (buf_no >= BUFSIZE)            // バッファが満杯であれば 
        return (EOF);                // これ以上押し戻せない 
    else {
        buf_no++;
        buffer[rear_ptr++] = ch;
        if (rear_ptr == BUFSIZE)
            rear_ptr = 0;
        return (ch);
    }
}


// 1文字入出力ライブラリの利用例 list11_2a.c

#include  <ctype.h>
#include  <stdio.h>

int getchr(void);
int ungetchr(int ch);

//--- 整数(数字の列)を読み込んで2倍の値を表示 ---
int getnum(void)
{
    int     c = 0;
    int     x = 0;
    int     ch;

    while ((ch = getchr()) != EOF  &&  isdigit(ch)) {
        x = x * 10 + ch - '0';
        c++;
    }
    if (ch != EOF)
        ungetchr(ch);
    if (c) printf("%d\n", x * 2);

    return (ch);


//--- 文字を読み込んでそのまま表示 ---
int getnnum(void)
{
    int     ch;

    while ((ch = getchr()) != EOF  &&  !isdigit(ch))
    //getchar 関数は標準入力から 1 文字分文字を読み取ります

        putchar(ch);
    if (ch != EOF)
        ungetchr(ch);
    putchar('\n');

    return (ch);
}

int main(void)
{
    while (getnum() != EOF)
        if (getnnum() == EOF)
            break;

    return (0);
}

/* 実行結果
naka@naka ~/meikaicjs/chap11
$ gcc -c list11_1.c -Wall

naka@naka ~/meikaicjs/chap11
$ gcc -c list11_2.c -Wall

naka@naka ~/meikaicjs/chap11
$ gcc list11_1.o list11_2.o -Wall

naka@naka ~/meikaicjs/chap11
$ gcc list11_1.o list11_2.o -o list11_1_2  -Wall

naka@naka ~/meikaicjs/chap11
$  list11_1_2
123abc
246
abc

^Z

naka@naka ~/meikaicjs/chap10
$

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • y_waiwai

    2018/03/18 15:02

    コンパイラ&デバッガはなにを使っているのでしょうか?

    キャンセル

  • sanchu52

    2018/03/18 15:38

    コンパイラはgcc,デバッガはそれに付属しているgdbです。あちこち飛んでいるので、時間たつとわからなくなります。123abと打ち込んで取り出していくんですが、数字から文字に切り替わるところが、わかりません。デバッグをbreak mainで始めて、すぐに123abと打ち込みたいのですが,getchar()で待ちにならないので教えてもらえますか。すが

    キャンセル

  • sanchu52

    2018/03/19 09:24

    eclipseをインストールしました。list11_1.c,list11_2.cをビルド、実行の仕方を教えて頂けますか。単独のファイルは実行できたのですが、gccでするようにできますか

    キャンセル

回答 1

checkベストアンサー

+1

getchar を使って1文字づつ入力していろいろやってるのはわかりますが、
fgets を使って1行ごとの文字列を入力して、その文字列から数値変換してやっていくほうがいいかと思われますがどうでしょう。


で、C言語のデバッグですが、Ecripseを使えばどうでしょうか。
http://mergedoc.osdn.jp/
ここから、最新バージョンEclipse4.7 > C/C++版をダウンロード、インストールすれば、統合環境からコード入力、デバッグでワンステップづつ実行、確認できる環境が手に入ります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/18 19:15

    ありがとうございます。今からお仕事です。明日やってみます。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Cに関する質問
  • list11_1a.c,list11_2a.cの分割コンパイルでデバッグでステップbyステップで様子が見たい