• ベストアンサー

isdigit

char s[3] = "5"; if(isdigit(atoi(s)) != 0){ printf("数字"); } としても表示されません。というよりifの中に入らないのですが どうしてでしょうか? それと文字列の最初の文字が数字かどうかの判定 をしたいのですが どうすればいいのか教えて下さい。 char *str; str= s; と配列の先頭にポインタを割り当ててみましたがどうもよくわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>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。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

処理系不明なので断定的なことはいうべきではありませんが... すでに回答が出ているように、atoi(s)は整数値の5を返します。 この5が、'0'~'9'のいずれかの数字に該当すれば、isdigitは真を返します。今回はそうではなかったということでしょう。 なお、'0'がどんな値になるかは処理系に依存します。 標準規格で保証されているのは、'0'~'9'が連続した整数値であること、および'0'~'9'の値が正であることだけです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

atoi(s) を実行すると、結果は数値の5となります。 数字の'5'ではありません。 isdigit(数値の5)の結果は、偽です。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

char s[3] = "5"; 文字列の最初の文字は s ではなく s[0]

回答No.1

char s[3] = "5"; if (isdigit(s[0]) != 0) { printf("文字列の最初の文字が数字"); } では?

zaqwe
質問者

補足

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

関連するQ&A