• ベストアンサー

文字列から数字への変換

文字列から数字への変換にはatoiなどを使うと思うのですが これだと文字として0を変換すると アルファベットなどを変換した場合と 同じになってしまいますよね? 0も入力を受け付けてなおかつ文字列は受け付けないように するにはどのようにすればよいのでしょうか? アドバイス・回答よろしくお願いします

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

通常は#1の方が述べているように自前で、atoi相当の関数を作ります。 以下の例は自前のatoiの最も簡単な例です。 この関数をmy_atoiとします。 int my_atoi( char *str ) { int i; int num = 0; char *p = str; int len = strlen(str); if (len > 9) return -1; for (i = 0; i < len;i++,p++){ if (*p < '0' || *p >'9') return -1; num = (10 * num) + (*p - '0'); } return num; } 入力文字列を数値に変換した結果を返します。 エラーがあった場合は-1を返します。 入力文字列は最大9桁までで'0'から'9'の文字のみ有効とします。(+,-、A等はエラーとなります) 入力文字列は終端が\0であることが前提です。 int a; a=my_atoi("02342"); のように使います。

weasel
質問者

お礼

ぜひ使ってみようと思います。 勉強になりました。 回答有難うございました。

その他の回答 (3)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

strtod()を使い、endptrを調べる。 strtod http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtod.3.html

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtod.3.html
weasel
質問者

お礼

回答有難うございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

strtol とか.

weasel
質問者

お礼

回答有難うございます。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

一番楽(で遅い)な方法は文字列を全部舐めて0~9の範囲を確かめること。ASCIIの0x30~0x39だ。

weasel
質問者

お礼

やってみようと思います。 有難うございました。

関連するQ&A

  • 文字列を数字のみにエンコードして圧縮したい

    アルファベットの文字列を数字のみに変換してできる限り容量を圧縮したいです。 たとえばASCIIコードに変換して・・・でも数字のみに変換はできますが容量を極力減らしたいです。 何か既存のアルゴリズムで良い方法ないでしょうか? 対象はアルファベット小文字のみの26文字で す。 例えば (log 10^10)/log26=7.06なので 10文字分の数字で 7文字相当のアルファベットを埋め込めるのかな?と思います。 単純にa=0 b=1・・・と割り当てて行って 文字列を26進数表記にした物を10進数に変換すれば一応できそうですが よりよい方法とか効率的な方法があれば教えてください。

  • 文字列を実数に変換するにはどうしたらいいでしょうか

    本に文字列を整数に変換する「atoi」はあったのですが、文字列を実数に変換する関数はないのでしょうか。教えて下さい。

  • 文字列をint型に変換したいのですが

    文字列をint型に変換して、計算に使用したいのですが うまくいきません。 char moji[0] = '1' moji[1] = '2' moji[2] = '3' この文字列をひとつずつint型の変数に代入したいのですが atoi関数を使用した場合、文字列全ての値が変換されてしまいます。 どうしたらいいのでしょうか? お答えいただけるとありがたいです。

  • 文字列を数字型に変換したい

    いつもお世話になっております。 eclipseというツールでC言語のプログラムを触っているのですが、 文字列の数字を数値型に変換して掛け算をしたいのですが、 型変換の関数はありますでしょうか??

  • エクセルセル内の文字列を数字にするには?

    エクセルセル内の文字列を数字に変換する方法はありますか?できれば複数のセルを一括で変換したいです。 回答宜しくお願いします。

  • Excelで数字の文字数を統一したい。

    こんにちは、エクセルにて数字が入力されている複数行、例えば 1 10 50 100 500 1000 と入力された数字を 0001 0010 0050 0500 1000 と数字の文字数を統一したいのですがどうすればよいでしょうか? 変換対象のセルの形式は、標準でも文字列でも特に問いません(これから入力するので)変換後のセルはおそらく文字列になると思います。 アドバイスお願いいたします。

  • CASLII:文字列→数字への変換の原理

    CASLIIにおいて 文字列を数字へ変換する場合、000FでAND演算をしますよね?この方法で変換が行なえることはわかるのですが、なぜ000FでAND演算をすると変換されるのか、その原理が分かりません。 ご教授のほどお願い致します。

  • エクセルで文字列の数字を数字に

    エクセルで文字列の数字を数字に変換する関数をご存知の方教えてください。宜しくお願いします。

  • 文字列を数字に変換する暗号化方式

    与えられた文字列を、可変長 ( 6 ~ 10 桁程度 ) のアラビア数字に変換するような暗号化方式やハッシュ関数を探しています。 あるいは、出力結果が数字で、名前が付いている方式ならば、それに近いものでも構いません。 どなたかご存知の方はいらっしゃらないでしょうか。 ご回答よろしくお願い致します。

  • 文字列の中から1~5桁の数字を抜き出したい

    ある命令プログラムを作っているのですが、文字列の中に命令語を書いてその後に続く数字を抜き出したいのですがうまくいきません ソースを見ていただきたいのですが @ke の命令語の後で1~5桁の数字を記載しているのですが 数字の部分を文字から数字に変えたいのです。 その後 @ke 数字 を正式な命令文として扱いたいのですがソースを見ていただけるとわかると思いますが問題があります。 ・文字をatoiで数字に変換できない(キャスト演算子を変えてもだめだった) ・ソースのプログラムの書き方ではやたらと長々しくなってしまう。 どのようにしたら問題が解決できますか? ----以下ソース---- #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main(){ char kei[100]="abc@ke 4567def@ke 789"; int i=0; int g=NULL; while(i<15){ if(kei[i]=='@'){ i++; if(strnicmp(&kei[i],"ke ",3)==0){ i+=3; //後に続く数字を抜き出して処理したい if(isdigit(kei[i])){ if(isdigit(kei[i+1])){ if(isdigit(kei[i+2])){ //・・・・以下全部で5桁分の数字を判定していく けど正直こんなややこしい方法をとらなくてもスマートにできるはず } else{ g=(atoi(kei[i])) * 10 +atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ g=atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ printf("\n命令の仕方が間違っています\n"); } } } else{ printf("%c",kei[i]); i++; } } return 0; }

専門家に質問してみよう