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

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

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

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

Q&A

解決済

4回答

6901閲覧

10進数かどうか判断させたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/08/13 13:06

C

1 #include <stdio.h> 2 #include <ctype.h> 3 4 5 #define IS_HEX(num) ((isdigit (num) != 0) ? 1 : 0) 6 7 int main(){ 8 9 int x = 10; 10 char e; 11 12 e = IS_HEX(x) ? 'y':'n'; 13 14 printf("%c",e); 15 return 0; 16 } 17

'y'の文字が表示されると思うのですが'n'と出てしまいます。

原因がわかる方アドバイスよろしくお願いします。

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

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

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

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

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

asm

2018/08/13 17:07

逆に、あなたが思う「10進数」じゃないものってなんでしょうか?
退会済みユーザー

退会済みユーザー

2018/08/14 03:22

10????2進数  413????8進数   10進数のつもりで書いていませんよ
guest

回答4

0

isdigitは、引数が、'0''1'、・・・、'9'のいずれかの時に真になります。
つまり整数で言うと、48、49、・・・、57のいずれかです。
整数の10は、どれとも等しくないので、偽です。

x = '0';とかx = '1';とかなら真になります。

投稿2018/08/13 13:15

otn

総合スコア84557

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

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

退会済みユーザー

退会済みユーザー

2018/08/13 13:19

シングルクォーテーションがついてないとダメということになりますか?
episteme

2018/08/13 13:36

やってみりゃわかること
cateye

2018/08/13 13:37

数字('0'=0x30〜'9'=0x39)でないとダメということです。また、"10"にした場合は文字列で、'1'と'0'となるためisdigit()で判断は出来ません。int x = 0x30;またはintx= 48;ならyが表示されると思います。
退会済みユーザー

退会済みユーザー

2018/08/13 13:38

コメントする前に、やりましたよ(汗)
episteme

2018/08/13 13:40

やってみたけど期待通りの挙動ではなかったってことですか?
退会済みユーザー

退会済みユーザー

2018/08/13 13:41

まじすか、じゃあ2桁の数字の場合10進数か判断isdigit では判断できないということですね
退会済みユーザー

退会済みユーザー

2018/08/13 13:41

確認のため、聞きましたすみません
episteme

2018/08/13 13:44

isdigitに食わすのは 文字 であって 文字列 ではありません。
退会済みユーザー

退会済みユーザー

2018/08/13 13:56

なるほど1桁オンリーワンになってことちゃうのか。
chun

2018/08/13 13:56

数値と数字(数を表現した文字)の違いを理解しましょう。 ASCIIコード表を見るとわかります。 http://www.k-cube.co.jp/wakaba/server/ascii_code.html 例えば、'9'は数値としては57となり、9ではありません。 9だとTABコードになります。
退会済みユーザー

退会済みユーザー

2018/08/13 14:00 編集

そっかー、文字はアスキーコードになちゃうのかー。そしたら10進数かどうか調べるためのiddigitめちゃくちゃやな、、、。
otn

2018/08/13 15:22

「10進数かどうか」という日本語もおかしいです。調べられるのはあくまで、「数字かどうか」です。
rubato6809

2018/08/13 22:06 編集

"10" という文字列なら ’1’ と '0' という2文字を検査するだけですけどね・・・
退会済みユーザー

退会済みユーザー

2018/08/14 03:20

ですよねー、けど2進数かもしれない場合10進数じゃないかもしれないんですね
cateye

2018/08/14 10:24 編集

題意とは外れますが、たとえば、12と書けば”少なくとも“2進ではない”・・・19と書けば“8進”ではないとなります。ただ、上記12や19は数値であって数字でありませんd^^ (通常)数字は'0'〜'9'のASCIIコードの事です。数字の演算'8'-'0'は数値の8になります。コンピュータの中の妖精さんは、'0'がメモリ(プログラム?)にあるときそれが、文字('0')なのか数値(0x30)なのかは分かりません。わかっているのはプログラムを書いた人(or 見てる人)だけです。したがって、書いた人が“2進数だ”と言えばそうなります。
退会済みユーザー

退会済みユーザー

2018/08/14 10:39

区別はC言語で表現することはできず 自分でするしかないってことですね やはりそうなりますよねー
guest

0

isdigit関数(マクロ)は、引数に文字を取り、それが'0'~'9'の範囲のときに0以外を返します

これ以上でもこれ以下でもないですね

投稿2018/08/13 21:53

y_waiwai

総合スコア87774

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

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

0

文字コードと isdigit() などの意味を学ぶ必要があるようですね。
ASCIIコードは文字コードの基本中の基本です。アスキーコード表をご覧ください。

isdigit(num) は、num の値を一文字のASCIIコード値と見て判定します。isdigit(num) が真を返すのは numの値が'0'〜'9'である場合です。わかりやすく10進数の値で示せば、48〜57である場合に真を返すという意味です。

x = 10; として isdigit(x) としたので、 isdigit(10) は上記の範囲外ですから偽を返します。'n'が表示されるのは当然です。

2桁の数字の場合10進数か判断isdigit では判断できない?

  • 10 〜 99 の整数値は、10進数なのか2進数なのか8進数か、16進数か何を以って判断する?
  • "10" という文字列が10進数に見えるか、というと、これ2進数にも8進数にも、16進数にも見えるが、さて、どういう基準で判定する?

考えてみて。


int x = 10; としたら、x は10進数なのか?
int x = 012; としたら、x は8進数なのか?
int x = 0x00A; としたら、 x は16進数なのか?
コンピュータが2進数を使って動いていることは良く知られていて、いずれの場合も x には 00001010 のような2進数が格納されます。
じゃあ、x は10進数でもなく8進数でもなく16進数でもなく2進数だ、と言うべき???

画面に「10」と表示された、ソースコード上に「x = 10;」と書いた、等など。こうした時に '1'(== 49 == 0x31) と '0'(== 48 == 0x30)という2つのアスキーコードが使われていること。
数を扱う時に数値そのものを扱う場面も、もちろんあるけれど、数字あるいは数字の文字列を扱っている場面が頻繁にあるわけです。今扱っているモノが、数値なのか、数字一文字なのか、数字の文字列なのか、それらを明確に区別できる事はプログラミングを学び始めた人にとって重要なステップなんだと思います。
念の為:'0', '1', 'M'、'\n' などの文字コードを、プログラム中で整数値として扱うのがC言語ですから、これも混乱しますよね笑。
Enjoy!

投稿2018/08/13 13:51

編集2018/08/13 22:57
rubato6809

総合スコア1380

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

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

退会済みユーザー

退会済みユーザー

2018/08/13 14:02

アスキーコードは、知っていました(汗)
退会済みユーザー

退会済みユーザー

2018/08/13 14:04

2進数と10進数の区別が難しいですね、、、。
rubato6809

2018/08/13 21:57 編集

"10"だけだと何も区別つきません。 C言語の文法は、どうやって区別しているか、自分で整理してみよ。
guest

0

ベストアンサー

C

1 #include <stdio.h> 2 #include <ctype.h> 3 4 5 #define IS_HEX(num) (isdigit (num) != 0 ? 1 : 0) 6 7 int main(){ 8 9 int x,i,j,ok = 0; 10 char s[100]; 11 char e[256]; 12 fgets(s,sizeof(s),stdin); 13 sscanf(s,"%d",&x); 14 15 for(i = 0;s[i] != '\0';i++){ 16 17 if(s[i] == '\n') 18 break; 19 20 21 22 e[i] = IS_HEX(s[i]) ? 'y':'n'; 23 24 if(e[i] == 'y') 25 ok++; 26 } 27 28 29 if(ok == i) 30 printf("10進数だぜ\n"); 31 32 else 33 printf("10進数ではないだとおおおおおぉぉぉぉぉぉぉ\n"); 34 35 36 return 0; 37 } 38

なんとか文字と10進数の区別はできました

投稿2018/08/14 11:09

編集2018/08/14 11:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

y_waiwai

2018/08/14 11:14

#define IS_HEX(num) isdigit (num) でいきましょう
rubato6809

2018/08/14 12:14

全桁が数字であれば10進数だ、ならそれで構わないでしょう。 でも、ツッコミどころ満載のコードで、見ていて楽しいですねえwww ちなみに、私的基準ては優先順位が低いものの、IS_HEXというマクロ名もツッコミたいところです笑。
rubato6809

2018/08/14 12:31

動いたことで満足しないほうが良いです。 私がツッコミたいことを今すべて手直しする必要は無いですが、ムダなことをしていないか、もっと効率良い方法はないか、もっと適切に・シンプルに書けないか等々、貴方自身で見直せる点が少なくとも2〜3点は見つけられるはずです。動くコードを改良することも良い勉強になります。
退会済みユーザー

退会済みユーザー

2018/08/14 13:16

なぜこれなのですか #define IS_HEX(num) isdigit (num)
y_waiwai

2018/08/14 13:27

逆に、なぜアレなんでしょう なぜそうすべきなのかよく考えましょう
退会済みユーザー

退会済みユーザー

2018/08/14 13:52 編集

#define IS_HEX(num) isdigit (num) この文にする必要性が全く感じられません と思ったのですがなぜかできる
rubato6809

2018/08/14 13:52 編集

uhooooooo君は #define IS_HEX(num) (isdigit (num) != 0 ? 1 : 0) とする必要性がある、と主張したいのかしら?
rubato6809

2018/08/14 13:54

#define IS_HEX(num) isdigit (num) で動作可能です。 さて、そうすると・・・
退会済みユーザー

退会済みユーザー

2018/08/14 13:54

いらないことに気づきましたが、理由を模索中です
rubato6809

2018/08/14 13:58

いらない・・・その通りですねw
退会済みユーザー

退会済みユーザー

2018/08/14 14:01

そんなこと言ったら#defineなしで e[i] = isdigit(s[i]) ? 'y':'n'; この文だけでいいことになりますね
rubato6809

2018/08/14 14:05

そうです。他にも要らないものがいくつかあるけどw
退会済みユーザー

退会済みユーザー

2018/08/14 14:45

うほー(汗)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問