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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/14 03:22
回答4件
0
isdigit
は、引数が、'0'
、'1'
、・・・、'9'
のいずれかの時に真になります。
つまり整数で言うと、48、49、・・・、57のいずれかです。
整数の10は、どれとも等しくないので、偽です。
x = '0';
とかx = '1';
とかなら真になります。
投稿2018/08/13 13:15
総合スコア84557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/13 13:19
2018/08/13 13:36
2018/08/13 13:37
退会済みユーザー
2018/08/13 13:38
2018/08/13 13:40
退会済みユーザー
2018/08/13 13:41
退会済みユーザー
2018/08/13 13:41
2018/08/13 13:44
退会済みユーザー
2018/08/13 13:56
2018/08/13 13:56
退会済みユーザー
2018/08/13 14:00 編集
2018/08/13 15:22
2018/08/13 22:06 編集
退会済みユーザー
2018/08/14 03:20
2018/08/14 10:24 編集
退会済みユーザー
2018/08/14 10:39
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総合スコア1380
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/13 14:02
退会済みユーザー
2018/08/13 14:04
2018/08/13 21:57 編集
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/14 11:14
2018/08/14 12:14
2018/08/14 12:31
退会済みユーザー
2018/08/14 13:16
2018/08/14 13:27
退会済みユーザー
2018/08/14 13:52 編集
2018/08/14 13:52 編集
2018/08/14 13:54
退会済みユーザー
2018/08/14 13:54
2018/08/14 13:58
退会済みユーザー
2018/08/14 14:01
2018/08/14 14:05
退会済みユーザー
2018/08/14 14:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。