電子書籍の厳選無料作品が豊富!

・数字文字列を数値化する関数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);
}


です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。 

A 回答 (3件)

レポート、課題の類には普段は回答することはないのですが、特別にヒントを差し上げましょう。



もらった文字列は10進数の数字文字列処理だけでよいのですね?

1)もし先頭の文字が空白であれば読み飛ばしましょう。
2)先頭に - の文字が来れば負の数、+がくるか何もなければ正の数です。
これで、符号は分かりました。
3)一文字読み込みます。
ここで数字が来なければエラーですね。

4)数字の文字aが来たら、その文字から 0x30 差し引きます。
すると、 0~9の数字になりますので、 s = s + (short) a - 0x30
とすれば結果を格納する変数s(short型)に入れることが出来ます。

5)更に文字を一つ読み進めます。
読むべき文字がない場合や空白であれば数字の終わりでしょう。
小数点の時には、エラーにするか正常終了として打ち切るか選択の余地があります。
他の文字だとエラーですね。

数字であれば前の s = s * 10 として、4)の処理に戻るわけです。

最後に先に求めてあったsの符号を整えて出来上がりです。


上記は説明しやすいような順序にしてあるので、プログラム上はもっと効率よくできるでしょう。

では頑張って下さい。
    • good
    • 0

こっちは、エラーチェックがある分、ちょっと面倒だね。


でもプログラム自体は、数値→文字列よりは簡単かな。

#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 屋さんかな。
こんなことでも、ちょっとずつ考え方が違ってくるのって、面白いね。

いろいろ分かってくると、もっと面白くなるので、頑張って。

# もう、寝てるのだったら、知らん :-)
    • good
    • 1

全てを答えてしまうと貴方のためにならないので


ヒントのみ

1. pStr のサイズを求める
2. 先頭1バイトの判定( 符号か数値か )
3. 桁数の算出(符号の有無に注意)
4. 計算結果エリアの初期化
5.繰り返し( 桁数分(数値の下位桁からの方が簡単))
  ・判定処理(switch を 使い 0 ~ 9 と それ以外)
   の分岐を作る
  ・各々の分岐処理
   計算エリア = 計算エリア + ( n * 10^桁数-1)
   ※ n は 0 ~ 9 に対応
  ・例外処理
   エラーにしましょう
6.符号処理
  計算エリア * 1 又は -1

以上をコード化すればよいのでは
注意としては 上1桁が符号の場合 桁数が1桁減る事に注意
1箇所このままではだめな所あり→実行して考えてください

専門学校に入ったのは、プログラム(情報処理)技術をマスタしたい
為と思います。 ですのであえて CODEは表示しません自分で考えてください。
    • good
    • 0
この回答へのお礼

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

がんばってみます。夜中にありがとうございます。

お礼日時:2002/08/30 00:18

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