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

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

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

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

Q&A

解決済

3回答

1357閲覧

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

ryu72639

総合スコア14

C

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

0グッド

1クリップ

投稿2018/07/03 01:46

編集2018/07/03 05:22

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

c

1#include <stdio.h> 2#include <stdlib.h> 3const int MAXSIZE = 130; /* スタックサイズ */ 4/: スタックするデータ構造*/ 5typedef struct kakko Kakko; 6struct kakko { 7 int kind; /* 括弧の種類*/ 8 int line; /* 位置:行 */ 9 int pos; /* 位置:列 */ 10}; 11Kakko stack[130]; 12int pnt; 13 14 15Kakko pop(void) 16{ 17 if (pnt < 0 || pnt == 0) { 18 printf("NG\n"); 19 exit(1); 20 } 21 pnt--; 22 return stack[pnt]; 23} 24 25void push(Kakko b) 26{ 27 if (pnt >= MAXSIZE) { 28 printf("NG\n"); 29 exit(1); 30 } 31 stack[pnt] = b; 32 pnt++; 33 34} 35 36/* stackが空かどうか*/ 37int empty(void) 38{ 39 return (pnt == 0) ? 1 : 0; 40} 41 42/* スタックの最上位の文字種を返す*/ 43int peek() 44{ 45 return stack[pnt-1].kind; 46} 47 48/* 括弧の判別*/ 49int kind(int ch) 50{ 51 int code; 52 switch (ch) { 53 case '(': 54 code = 1; 55 break; 56 case ')': 57 code = 2; 58 break; 59 case '{': 60 code = 3; 61 break; 62 case '}': 63 code = 4; 64 break; 65 case '[': 66 code = 5; 67 break; 68 case ']': 69 code = 6; 70 break; 71 default: 72 code = 0; // 括弧以外の文字 73 break; 74 } 75 return code; 76} 77int main(void) 78{ 79 int ch; 80 char fname[64]; /* ファイル名*/ 81 int k; /* 文字の種類*/ 82 int line = 1, pos = 0; 83 int False1 = 0; 84 int False2 = 0; /*NG表示*/ 85 Kakko kakkos, temp; 86 pnt = 0; /* スタックポインタの初期化*/ 87 88 /*一文字ずつ読む*/ 89 while ((ch = getchar()) != EOF) { 90 if (ch == '\n') { 91 line++; pos=0; 92 /*printf("%d行目\n", line);*/ 93 continue; 94 } 95 pos++; 96 /*printf("%d", pos);*/ 97 k = kind(ch); 98 if (k > 0) { /* 文字が括弧の場合*/ 99 if (k % 2) { /* 開き括弧の場合*/ 100 kakkos.kind = k; 101 kakkos.line = line; 102 kakkos.pos = pos; 103 push(kakkos); 104 } else if (!empty() && (k == peek()+1)) { 105 temp = pop(); /* 対応する閉じカッコ有り*/ 106 } else { /*なし*/ 107 printf("対応する開き括弧がない\n"); 108 printf("%d行目の%d文字目。\n", line, pos); 109 False1 = 1; 110 } 111 } 112 if (!empty()) { 113 printf("対応する閉じ括弧がない。\n"); 114 while (!empty()) { 115 temp = pop(); 116 printf("%d行目の%d文字目。\n", temp.line, temp.pos); 117 False2 = 1; 118 } 119 } 120 } 121 printf("%d\n", False1); /*ここでFalse1,False2に何が入ってるのか確認しようとしても何も表示されません*/ 122 printf("%d\n", False2); 123 if (False1 == 1 || False2 == 1){ 124 printf("ng\n"); 125 } 126 else 127 printf("ok\n"); 128 return 0; 129}

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

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

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

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

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

otn

2018/07/03 02:12

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

2018/07/03 05:03

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

回答3

0

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

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

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

投稿2018/07/03 05:52

sh_akira

総合スコア380

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

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

ryu72639

2018/07/03 07:47

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

2018/07/03 08:32

あーMacなんですね?環境は先に書いてください。回答が無駄になることもあります。 Macのターミナルではcontrol+DでEOFが出るはずです。 それよりもう一度聞きますが、あなたはこのプログラムがどうしたら終了するとイメージして 作っていますか?本当にEOFで終わりで良いですか?
guest

0

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

投稿2018/07/03 02:19

y_waiwai

総合スコア87719

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

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

ryu72639

2018/07/03 05:12

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

2018/07/03 06:00

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

0

ベストアンサー

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

投稿2018/07/03 02:16

ttyp03

総合スコア16996

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

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

ryu72639

2018/07/03 05:20

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

2018/07/03 05:24

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

2018/07/03 05:27

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

2018/07/03 05:30

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

2018/07/03 07:00

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

2018/07/03 07:44

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

2018/07/03 07:46

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

2018/07/03 08:11

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

2018/07/03 08:13

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

2018/07/03 08:31

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

2018/07/03 08:36

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

2018/07/03 08:38

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

2018/07/03 08:54

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

2018/07/03 09: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++;
ryu72639

2018/07/03 10:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問