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

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

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

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

Q&A

解決済

3回答

1588閲覧

rpn電卓を作るに当たって発生しているエラーの解決とプログラムの完成

NieRclan3

総合スコア15

C

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

0グッド

0クリップ

投稿2022/01/22 17:48

rpn電卓のプログラムを作成していて、
conflicting types for 'strtok'
implicit declaration of function 'isdigit' [-Wimplicit-function-declaration]
というエラーメッセージがでていて解決方法が分かりません。
また、プログラムに足りていないところがあれば教えていただきたいです。
プログラムの条件としてfgetsとstrtok関数を使うこと。というのがあります。

C言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int stack[100]; 6int top = 0; 7char *strtok(char*s1,char*s2); 8 9int push(int x); 10int pop(); 11 12int push(int x) 13{ 14 if (top == 100) 15 return -1; 16 stack[top] = x; 17 top++; 18 return 1; 19} 20 21int pop() 22{ 23 --top; 24 return stack[top]; 25} 26int main(void) 27{ 28 int a,b; 29 char str[80],*tok; 30 char delim[]=","; 31 fgets(str,80,stdin); 32 tok=strtok(str,delim); 33 while (tok != NULL) 34 { 35 if (isdigit(*tok)) 36 { 37 push(atoi(tok)); 38 } 39 else 40 { 41 a = pop(); 42 b = pop(); 43 switch (*tok) 44 { 45 case '+': 46 push(b + a); 47 break; 48 case '-': 49 push(b - a); 50 break; 51 case '*': 52 push(b * a); 53 break; 54 case '/': 55 push(b / a); 56 default: 57 fprintf(stderr, "operator expected\n"); 58 exit(0); 59 } 60 } 61 tok = strtok(NULL,delim); 62 } 63 printf("%f\n", pop()); 64 65 return 0; 66} 67

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

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

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

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

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

guest

回答3

0

ベストアンサー

conflicting types for 'strtok'
implicit declaration of function 'isdigit' [-Wimplicit-function-declaration]

問題のメッセージは2つあります。メッセージの意味を、質問者はどれだけ調べましたか?そのままグーグル翻訳してみますと、こうなりました。

'strtok'の競合するタイプ
関数の暗黙の宣言 'isdigit' [-Wimplicit-function-declaration]

訳がこなれてない感がありますが実用になります。コンパイラが出すメッセージはさほど多くありません。いくつかのパターンに集約されるので、英語が苦手でも慣れてくれば「ああ、あの手のミスか」と見当がつきます。

'strtok'の競合するタイプ・・・conflict(競合する・衝突する)type(int, char など、変数の型のこと)、つまり、プログラム中に 'strtok'が2か所以上出現するが「型がくい違っているぞ。正しい型がわからないのでコンパイルできない」と言ってるのです。

strtok() は標準ライブラリ関数の一つです。関数仕様を調べましたか?調べ方、調べるべき資料はいろいろありますが、「strtok c言語」で検索してみると私の手元で先頭に出たページは
strtok でした。

文字列を区切り文字で分解する 【書式】 #include <string.h> char *strtok(char *s1, const char *s2);

ここで気づいてほしいのが、質問者のコードの次の行(プロトタイプ宣言)との違い、const の有無です。
char *strtok(char*s1,char*s2);

const の有無も型の違いになります。
対策は、strtokの関数仕様【書式】に示されているように、<string.h> をインクルードする・・・おっと、すでにインクルードしてあり、その中に正しいプロトタイプ宣言があるので、あなたの書いたプロトタイプ宣言と競合するのです。コード中にプロトタイプ宣言を書く必要は無い・・・よって、通常の結論はプロトタイプ宣言を削除することです。

ですが、ここでひとつ試してみるのも勉強です。貴方のプロトタイプ宣言に const を書き加えたらどうなるか。つまりこう書いてみる。
char *strtok(char*s1, const char*s2);
"conflicting types for 'strtok'" は出なくなる可能性あり、です。型の競合がなくなるから。

もう一つ。implicit declaration of function 'isdigit'
implicit(暗黙の)declaration(宣言)of function 'isdigit'(関数 isdigit の)。
関数プロトタイプ宣言がないのに、いきなり isdigit()関数を使っている(呼び出してる)。
if (isdigit(*tok)) の所です。「型がわからないから、関数の戻り値も、関数の引数も、
int 型だと仮定してコンパイルするけど、よいか?」と言ってます。Cコンパイラは、型が示されないと int だと仮定してコンパイルすることになっています。

これも isdigit 関数の仕様を確認しましょう。要は #include <ctype.h>

なお、implicit declaration of function ~ は警告(warning)です。警告はするけどコンパイルはでき、実行もできます。その結果責任はもちろん貴方にあります。
ちなみに implicit の反対は explicit(明示)です。ヘッダファイルをインクルードすれば、関数の型をコンパイラに明示することになります。

2つともプロトタイプ宣言のミスでした。自分で調べて対策を見つけることができます。それと英語を毛嫌いしないこと。一度調べるだけで結構役に立つものです。
Enjoy !

投稿2022/01/23 00:23

編集2022/01/23 00:50
rubato6809

総合スコア1380

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

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

0

implicit declaration of function 'isdigit' [-Wimplicit-function-declaration]

関数の宣言が食い違ってますで、と言うエラーなので、

char strtok(chars1,char*s2);

これを正しく修正する、か、たんに削除しておけばいいです

投稿2022/01/23 00:17

y_waiwai

総合スコア87715

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

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

0

strtok は string.h に宣言されています。
char *strtok(char*s1,char*s2); をご自身で書く必要はありません。

isdigit は ctype.h で宣言されています。
ctype.h を include してください。

投稿2022/01/22 17:56

編集2022/01/22 17:57
jimbe

総合スコア12510

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問