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

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

ただいまの
回答率

90.34%

  • C

    3964questions

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

文字に数字が代入されない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 259

ryu72639

score 6

かっこが対応するかどうかのプログラムを作りました。
しかし、最後のifのところでfalse1、false2に数字が代入されていません。なぜなのでしょうか?

#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 130; /* スタックサイズ */                                                   
/: スタックするデータ構造*/                                                                      
typedef struct kakko Kakko;
struct kakko {
  int kind; /* 括弧の種類*/                                                                            
  int line; /* 位置:行 */                                                                             
  int pos; /* 位置:列 */                                                                              
};
Kakko stack[130];
int pnt;


Kakko pop(void)
{
  if (pnt < 0 || pnt == 0) {
    printf("NG\n");
    exit(1);
  }
  pnt--;
  return stack[pnt];
}

void push(Kakko b)
{
  if (pnt >= MAXSIZE) {
    printf("NG\n");
    exit(1);
  }
  stack[pnt] = b;
  pnt++;

}

/* stackが空かどうか*/
int empty(void)
{
  return (pnt == 0) ? 1 : 0;
}

/* スタックの最上位の文字種を返す*/
int peek()
{
  return stack[pnt-1].kind;
}

/* 括弧の判別*/
int kind(int ch)
{
  int code;
  switch (ch) {
  case '(':
    code = 1;
    break;
  case ')':
    code = 2;
    break;
  case '{':
    code = 3;
    break;
  case '}':
    code = 4;
    break;
  case '[':
    code = 5;
    break;
  case ']':
    code = 6;
    break;
  default:
    code = 0; // 括弧以外の文字                                                                      
    break;
  }
  return code;
}
int main(void)
{
  int ch;
  char fname[64]; /* ファイル名*/
  int k; /* 文字の種類*/
  int line = 1, pos = 0;
  int False1 = 0;
  int False2 = 0; /*NG表示*/
  Kakko kakkos, temp;
  pnt = 0; /* スタックポインタの初期化*/

   /*一文字ずつ読む*/
   while ((ch = getchar()) != EOF) {
    if (ch == '\n') {
      line++; pos=0;
      /*printf("%d行目\n", line);*/
      continue;
    }
    pos++;
    /*printf("%d", pos);*/
    k = kind(ch);
    if (k > 0) { /* 文字が括弧の場合*/
      if (k % 2) { /* 開き括弧の場合*/
        kakkos.kind = k;
        kakkos.line = line;
        kakkos.pos  = pos;
        push(kakkos);
      } else if (!empty() && (k == peek()+1)) {
        temp = pop(); /* 対応する閉じカッコ有り*/
      } else {  /*なし*/
        printf("対応する開き括弧がない\n");
        printf("%d行目の%d文字目。\n", line, pos);
        False1 = 1;
      }
    }
    if (!empty()) {
      printf("対応する閉じ括弧がない。\n");
      while (!empty()) {
        temp = pop();
        printf("%d行目の%d文字目。\n", temp.line, temp.pos);
        False2 = 1;
      }
    }
   }
   printf("%d\n", False1); /*ここでFalse1,False2に何が入ってるのか確認しようとしても何も表示されません*/
   printf("%d\n", False2);
   if (False1 == 1 || False2 == 1){
    printf("ng\n");
   }
 else
   printf("ok\n");
  return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • otn

    2018/07/03 11:12

    「何も表示されない」とは、ゼロすら表示されていないと言う事?ngまたはokはどうですか?

    キャンセル

  • ryu72639

    2018/07/03 14:03

    そういうことです。ngもokも表示されないです

    キャンセル

回答 3

checkベストアンサー

+1

コメント中の「何も表示されません」というのは、単にCTRL+Zで抜けていないだけではないでしょうか。
少なくとも必ず通るところだし、int型なので何も表示されないということはありません。
但し、いくつか問題があります。
emptyとpeekが重複定義されている(コピペミスでしょうか)
whileループ内の最後の処理if (!empty()) {~}はループの外に出す必要があります。
それ以外は問題なく動作しましたよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 14:20

    CTRL+Zで抜けているということはありません。
    また、emptyとpeekが重複しているとおっしゃていますが、そうです。すいませんでした。
    whileループ内の最後の処理if (!empty()) {~}はループの外に出す必要があります。
    →ループの外に外すと何も表示されなくなります。
    具体的には 
    外す前
    ((())
    対応する閉じ括弧がない。
    1行目の1文字目。
    対応する閉じ括弧がない。
    1行目の2文字目。
    対応する閉じ括弧がない。
    1行目の3文字目。
    対応する開き括弧がない
    1行目の4文字目。
    対応する開き括弧がない
    1行目の5文字目。

    外した後
    ((())

    となってしまいます。

    キャンセル

  • 2018/07/03 14:24

    >CTRL+Zで抜けているということはありません。
    そうではなくて、CTRL+Zを入力しないとループから抜けないということを言っています。
    閉じ括弧がない(開き括弧と一致しないではなく)という判定はすべての入力が終わったときにしか行えないはずですから。

    キャンセル

  • 2018/07/03 14:27

    すいません、先ほど実行例を入れましたが、全く違いますね。すいません。

    キャンセル

  • 2018/07/03 14:30

    おっしゃる通りです。CTRL+Zを入力しないと抜け出せれません。こういう時ってどうすればいいんですか?

    キャンセル

  • 2018/07/03 16:00

    ん?それでいいのでは?
    そういう風に作ったんでしょ?
    キーボードから入力する処理であれば何かしらで終わりを判定しないといけないので、それがCTRL+Zなのは妥当な処理だと思いますが。

    キャンセル

  • 2018/07/03 16:44

    CTRL+Zで終わらせてしまうとprintfで書いてる部分が表示されません。表示させるた目にはどうすればいいんでしょうか?

    キャンセル

  • 2018/07/03 16:46

    表示されないは括弧の対応が問題ないからだと思いますが。
    例えば次のように入れれば出ますよね。
    {[RET]
    {[RET]
    }[RET]
    CTRL+Z[RET]

    対応する閉じ括弧がない。
    1行目の1文字目。

    キャンセル

  • 2018/07/03 17:11

    ngやokが表示されないんですが。。。

    キャンセル

  • 2018/07/03 17:13

    MacだとCTRL+Dかな。
    Windows環境ではCTRL+Zで問題なく動いています。

    キャンセル

  • 2018/07/03 17:31

    なるほど、そこでしたか。
    ありがとうございました。
    今回はCTRL+Dで入力を終わるようにしましたが、もしENTERを押すとwhileループを抜け出すようにするにはどのようにするのがベストなのでしょうか?
    いきなりもう一つ質問してしまい、すいません m(_ _)m

    キャンセル

  • 2018/07/03 17:36

    見逃してましてたが、元々ENTERで抜ける処理が入っていたのですね。
    そこのif文内でcontinueしていますが、continueはループの先頭に戻るだけなので、breakにしましょう。
    これでループを抜けます。

    キャンセル

  • 2018/07/03 17:38

    あ、失礼。
    抜ける処理を意図したコードではないのかな?
    でもまあ改行コードの判定としてはあっているので、上記対応でいけると思います。

    キャンセル

  • 2018/07/03 17:54

    EOCというのは文字が入力されている間って、考えていいんですよね? だから、breakにすることによってエンターをおすつまり文字ではないもが入力されたから、ループを抜け出すと考えればいいんですか?

    キャンセル

  • 2018/07/03 18:07

    EOC?EOFのことですよね。
    ご自分が作られたコードについて聞かれるのも何か変ですが、今の作りは、EOFが入力されるまで繰り返す処理になっています。
    getcharという関数は文字を返しますが、EOFや改行も制御文字として返されます。
    詳細はアスキーコード表をご覧ください。
    http://www.geocities.co.jp/Technopolis/6545/moji/ascii.html
    1と入力すれば、16進数の0x31
    CTRL+Zは、16進数の0x1A
    ENTERは、16進数の0x0A

    EOFか改行が入力されるまで続けるという仕様にするのなら、次のようなコードにした方がわかりやすいかもしれません。
    (冒頭のところのみ)
    while (1) {
    ch = getchar();
    if (ch == EOF || ch == '\n') {
    break;
    }
    pos++;

    キャンセル

  • 2018/07/03 19:25

    なるほどそういう事ですか。申し訳ございません。まだ初めてばっかりで色々あやふやになっていますので…
    長い間御付き合いいただき、ありがとうございました。

    キャンセル

+1

入力の終了はどのように行うつもりでしたか?

while ((ch = getchar()) != EOF) {


EOFが来るまで回り続けるとなっています。
キーボードからCtrl+Zを打つとEOFが出るので終了します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 16:47

    それだとprintfの出力されません。どうすればいいのでしょうか?

    キャンセル

  • 2018/07/03 17:32

    あーMacなんですね?環境は先に書いてください。回答が無駄になることもあります。
    Macのターミナルではcontrol+DでEOFが出るはずです。

    それよりもう一度聞きますが、あなたはこのプログラムがどうしたら終了するとイメージして
    作っていますか?本当にEOFで終わりで良いですか?

    キャンセル

0

Windowsを使ってるなら、VisualStudioなんかを入れて、コードのデバッグができるようにしてはどうでしょうか。
各変数のナカミを確認しながら1行づつ実行させるってことができますぜ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 14:12

    残念ながらmacなので。。。

    キャンセル

  • 2018/07/03 15:00

    macでもeclipseあたりなら。

    いずれにせよ、デバッグ手段を持たないと、これ以上の規模のコードは書けなくなります
    ソースとにらめっこ、だと何ページにも渡るようなコードでは破綻します

    キャンセル

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

  • C

    3964questions

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