「ブロック機能」のリニューアルについて

char s[3] = "5";
if(isdigit(atoi(s)) != 0){
printf("数字");
}

としても表示されません。というよりifの中に入らないのですが
どうしてでしょうか?

それと文字列の最初の文字が数字かどうかの判定 をしたいのですが
どうすればいいのか教えて下さい。
char *str;
str= s;
と配列の先頭にポインタを割り当ててみましたがどうもよくわかりません。

教えて!goo グレード

A 回答 (5件)

>ifの中に入らないのですが


>どうしてでしょうか?

isdigit()は「引数が'0'~'9'の範囲ならtrueを返す」つまり「引数が48~57の範囲ならtrueを返す」と言う仕様です。

atoi()は「文字列を数字の並びと解釈して、数値に変換する」と言う仕様です。

従って「atoi(s)」や「atoi("5")」は「5」を返します。

なので「isdigit(atoi(s))」や「isdigit(atoi("5"))」は「isdigit(5)」と同じです。

isdigit()は「引数が48~57の範囲ならtrueを返す」ので引数が「5」の場合はfalseを返します。

falseは0と等しいですから「(isdigit(atoi(s)) != 0)」は「(false != 0)」つまり「(0 != 0)」と同じです。

「0 != 0」の演算結果はfalseですから「if(isdigit(atoi(s)) != 0){」は「if(false){」と同じです。

if文の判定式がfalseの場合、if文に続く文は実行されません。

>atoiいれなくてもいいのか・・
>うーむ

isdigit()は「文字が'0'~'9'かどうか?」を調べるのですから、atoiで「文字列を数値にしてしまった後の値」は調べられません。

>それと文字列の最初の文字が数字かどうかの判定 をしたいのですが
>どうすればいいのか教えて下さい。

「isdigit(調べたい文字を1文字)」でOK。

文字列sの先頭の文字は「*s」または「s[0]」なので「isdigit(*s)」か「isdigit(s[0])」でOK。
    • good
    • 0

処理系不明なので断定的なことはいうべきではありませんが...



すでに回答が出ているように、atoi(s)は整数値の5を返します。
この5が、'0'~'9'のいずれかの数字に該当すれば、isdigitは真を返します。今回はそうではなかったということでしょう。

なお、'0'がどんな値になるかは処理系に依存します。
標準規格で保証されているのは、'0'~'9'が連続した整数値であること、および'0'~'9'の値が正であることだけです。
    • good
    • 0

atoi(s) を実行すると、結果は数値の5となります。


数字の'5'ではありません。
isdigit(数値の5)の結果は、偽です。
    • good
    • 0

char s[3] = "5";


文字列の最初の文字は
s ではなく s[0]
    • good
    • 0

char s[3] = "5";


if (isdigit(s[0]) != 0) {
printf("文字列の最初の文字が数字");
}

では?

この回答への補足

atoiいれなくてもいいのか・・
うーむ

補足日時:2009/07/15 13:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

教えて!goo グレード

人気Q&Aランキング