• ベストアンサー

文字列→数値変換関数

・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。 

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

  • ベストアンサー
noname#11476
noname#11476
回答No.1

レポート、課題の類には普段は回答することはないのですが、特別にヒントを差し上げましょう。 もらった文字列は10進数の数字文字列処理だけでよいのですね? 1)もし先頭の文字が空白であれば読み飛ばしましょう。 2)先頭に - の文字が来れば負の数、+がくるか何もなければ正の数です。 これで、符号は分かりました。 3)一文字読み込みます。 ここで数字が来なければエラーですね。 4)数字の文字aが来たら、その文字から 0x30 差し引きます。 すると、 0~9の数字になりますので、 s = s + (short) a - 0x30 とすれば結果を格納する変数s(short型)に入れることが出来ます。 5)更に文字を一つ読み進めます。 読むべき文字がない場合や空白であれば数字の終わりでしょう。 小数点の時には、エラーにするか正常終了として打ち切るか選択の余地があります。 他の文字だとエラーですね。 数字であれば前の s = s * 10 として、4)の処理に戻るわけです。 最後に先に求めてあったsの符号を整えて出来上がりです。 上記は説明しやすいような順序にしてあるので、プログラム上はもっと効率よくできるでしょう。 では頑張って下さい。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

こっちは、エラーチェックがある分、ちょっと面倒だね。 でもプログラム自体は、数値→文字列よりは簡単かな。 #include <stdio.h> short AtoS(char* pStr, int* pRetCode) { short ret; int i; int is_minus = 0; *pRetCode = 0; if (*pStr == '-') { is_minus = 1; ++pStr; } i = 0; while (*pStr) { if ('0' <= *pStr && *pStr <= '9') { i = i * 10 + (*pStr - '0'); if (i > 32768) { *pRetCode = -3; return -1; } } else { *pRetCode = -1; return -1; } ++pStr; } if (is_minus) { i *= -1; } if (i < (short)0x8000 || (short)0x7fff < i) { *pRetCode = -2; return -1; } ret = (short)i; return ret; } int main(void) { short val; int code; val = AtoS("1234", & code); printf("%d %d\n",val,code); val = AtoS("-789", & code); printf("%d %d\n",val,code); val = AtoS("-32768", & code); printf("%d %d\n",val,code); val = AtoS("32768", & code); printf("%d %d\n",val,code); val = AtoS("-1234567", & code); printf("%d %d\n",val,code); val = AtoS("543x", & code); printf("%d %d\n",val,code); return 0; } # あー、仕事しなくちゃいけないのに、現実逃避してて良いんだろうか (^^; # 先の回答を見ると、この回答もちょっと穴があるね 思うに、No.1 さんは C 屋さんで、No.2 さんは VB 屋さんかな。 こんなことでも、ちょっとずつ考え方が違ってくるのって、面白いね。 いろいろ分かってくると、もっと面白くなるので、頑張って。 # もう、寝てるのだったら、知らん :-)

回答No.2

全てを答えてしまうと貴方のためにならないので ヒントのみ 1. pStr のサイズを求める 2. 先頭1バイトの判定( 符号か数値か ) 3. 桁数の算出(符号の有無に注意) 4. 計算結果エリアの初期化 5.繰り返し( 桁数分(数値の下位桁からの方が簡単))   ・判定処理(switch を 使い 0 ~ 9 と それ以外)    の分岐を作る   ・各々の分岐処理    計算エリア = 計算エリア + ( n * 10^桁数-1)    ※ n は 0 ~ 9 に対応   ・例外処理    エラーにしましょう 6.符号処理   計算エリア * 1 又は -1 以上をコード化すればよいのでは 注意としては 上1桁が符号の場合 桁数が1桁減る事に注意 1箇所このままではだめな所あり→実行して考えてください 専門学校に入ったのは、プログラム(情報処理)技術をマスタしたい 為と思います。 ですのであえて CODEは表示しません自分で考えてください。

noname#169100
質問者

お礼

ありがとうございます。 ほとんど、完成していて正の数は成功するのですが・・・。 int *pRetCodenoの使い方がわからず、負の数がうまくいきなせん。 がんばってみます。夜中にありがとうございます。

関連するQ&A