🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

2回答

1203閲覧

英字列と数字列の個数を数えて標準出力にそれらの個数をこの順に書き出すプログラム

Ryo-chan

総合スコア9

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2019/11/05 13:20

前提・実現したいこと

標準入力に与えらた文字をすべて読み取り、その中に現れる英字列と数字列の個数を数えて標準出力にそれらの個数をこの順に書き出すプログラムを作成したいのですが、コンパイルがうまくいかずプログラムを使用できません。
うまく定義ができていないと思われますが教えていただければと思います。

発生している問題・エラーメッセージ

p4-4.c: In function 'main': p4-4.c:7:5: error: redefinition of 'next' int next[3][3] ^ p4-4.c:5:5: note: previous definition of 'next' was here int next[3][3] ^ p4-4.c:14:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'for' for(ch= '0'; ch<='9'; ch++) ^ p4-4.c:14:14: warning: statement with no effect [-Wunused-value] for(ch= '0'; ch<='9'; ch++) ^ p4-4.c:14:27: error: expected ';' before ')' token for(ch= '0'; ch<='9'; ch++) ^ p4-4.c:14:27: error: expected statement before ')' token p4-4.c:19:9: error: 'word' undeclared (first use in this function) number= word= 0; state= 0; ^ p4-4.c:19:9: note: each undeclared identifier is reported only once for each function it appears in p4-4.c:23:9: error: 'action' undeclared (first use in this function) switch( action[state][kind[ch]] ){ ^

該当のソースコード

#include <stdio.h> #include <ctype.h> int main(int argc, char *argv[]){ int next[3][3] = {{0,1,2},{0,1,2},{0,1,2}}; int next[3][3] = {{0,1,2},{0,1,2},{0,1,2}}; int kind[128]= {0}; int ch; int state, number, word for(ch= '0'; ch<='9'; ch++) kind[ch]= 2; for(ch= 'a'; ch<='z'; ch++) kind[ch]= kind[toupper(ch)]= 1; number= word= 0; state= 0; for(; (ch= getchar())!=EOF;){ switch( action[state][kind[ch]] ){ case 0: break; case 1: word++; break; case 2: number++; break; } state= next[state][kind[ch]]; } printf("number:%d\n", number); printf("name:%d\n", word); return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

action を定義しないとだめでしょう。

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main(void) 5{ 6 int next[3][3] = { { 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 } }; 7 int action[3][3] = { { 0, 1, 2 }, { 0, 0, 2 }, { 0, 1, 0 } }; 8 int kind[128] = { 0 }; 9 int state = 0, number = 0, word = 0; 10 int ch; 11 for (ch = '0'; ch <= '9'; ch++) kind[ch] = 2; 12 for (ch = 'a'; ch <= 'z'; ch++) kind[ch] = kind[toupper(ch)] = 1; 13 14 while ((ch = getchar()) != EOF) { 15 switch (action[state][kind[ch]]) { 16 case 0: break; 17 case 1: word++; break; 18 case 2: number++; break; 19 } 20 state = next[state][kind[ch]]; 21 } 22 printf("%d\n", number); 23 printf("%d\n", word); 24 return 0; 25}

action の値がこうなる理由を説明できますか?

投稿2019/11/06 15:05

kazuma-s

総合スコア8224

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

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

0

エラーメッセージを一つ一つ、追いましょう。
英文で分からなければ、googleに聞くのもありでしょう。

さて、

p4-4.c:7:5: error: redefinition of 'next'

nextが再定義されていると言ってもいます。確かに、 5行目と、7行目にあります。

p4-4.c:14:1: error: expected '=', ',', ';', 'asm' or 'attribute' before 'for'

これは、よく分からない... と思えば、前の行の最後に ; が無い。
と、再度、エラーメッセージを見ると、before 'for' なんで、該当行の前が怪しい、、と分かります。

その次は、上記のエラーの為に、発生したエラーかと。

という感じで、調べられたら、どうでしょうか。

投稿2019/11/05 13:30

pepperleaf

総合スコア6385

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

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

Ryo-chan

2019/11/05 14:32

早速のご連絡ありがとうございます。 現在ここまで行きましたが未だに下記のエラーが残ります。 プログラム #include <stdio.h> #include <ctype.h> int main(int argc, char *argv[]){ int next[3][3] = {{0,1,2},{0,1,2},{0,1,2}}; int kind[128]= {0}; int ch; int state, number, word; number=word= 0; state= 0; for(; (ch= getchar())!=EOF;){ switch( action[state][kind[ch]] ){ case 0: break; case 1: word++; break; case 2: number++; break; } state= next[state][kind[ch]]; } printf("%d\n", number); printf("%d\n", word); return 0; } エラーコード p4-4.c: In function 'main': p4-4.c:14:9: error: 'action' undeclared (first use in this function) switch( action[state][kind[ch]] ){ ^ p4-4.c:14:9: note: each undeclared identifier is reported only once for each function it appears in どれが正しく定義しているのか分からなくなってしまいました。。。
SaitoAtsushi

2019/11/05 16:36

そのエラーは action が宣言されていないと言っています。 前後の雰囲気や変数名からすると状態遷移の考え方を用いようとしているように見えますが、提示されている目的にとっては不要です。 action, state, next は意味を成していないので消してかまいません。 その一方で kind に値を入れる処理は必要なので消してはいけません。
Ryo-chan

2019/11/06 14:36

すいません、お手数だと思いますが具体的にどのように変更するのか記載いただけますでしょうか。 理解不足で申し訳ありません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問