![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?8acaa2e)
・数字文字列を数値化する関数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);
}
です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。
No.1ベストアンサー
- 回答日時:
レポート、課題の類には普段は回答することはないのですが、特別にヒントを差し上げましょう。
もらった文字列は10進数の数字文字列処理だけでよいのですね?
1)もし先頭の文字が空白であれば読み飛ばしましょう。
2)先頭に - の文字が来れば負の数、+がくるか何もなければ正の数です。
これで、符号は分かりました。
3)一文字読み込みます。
ここで数字が来なければエラーですね。
4)数字の文字aが来たら、その文字から 0x30 差し引きます。
すると、 0~9の数字になりますので、 s = s + (short) a - 0x30
とすれば結果を格納する変数s(short型)に入れることが出来ます。
5)更に文字を一つ読み進めます。
読むべき文字がない場合や空白であれば数字の終わりでしょう。
小数点の時には、エラーにするか正常終了として打ち切るか選択の余地があります。
他の文字だとエラーですね。
数字であれば前の s = s * 10 として、4)の処理に戻るわけです。
最後に先に求めてあったsの符号を整えて出来上がりです。
上記は説明しやすいような順序にしてあるので、プログラム上はもっと効率よくできるでしょう。
では頑張って下さい。
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は表示しません自分で考えてください。
ありがとうございます。
ほとんど、完成していて正の数は成功するのですが・・・。
int *pRetCodenoの使い方がわからず、負の数がうまくいきなせん。
がんばってみます。夜中にありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
sscanfとscanfの違いがよくわか...
-
strstrを利用しない文字列検索...
-
CStringについて
-
小文字のみを数える方法
-
C言語のステップ数をカウントす...
-
日本語の変換の問題
-
Cで「大文字、小文字の判定」は...
-
gets fgetsについて
-
C言語でパスワード作成ツール
-
C言語の問題 キーボードから1 ...
-
putsとputcharの違い?
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
反転した数値を表示させるやり方
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
itoaわかりません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
fgetsで拾われる改行文字を削除...
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
Cで「大文字、小文字の判定」は...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
小文字のみを数える方法
-
strstrを利用しない文字列検索...
-
C言語のステップ数をカウントす...
-
C言語でパスワード作成ツール
-
単語数のカウントについて
-
str[j++]の意味
-
fgetsでバッファ残留文字列を無...
-
教えていただけませんか?C言語...
-
エディットボックスに入力され...
おすすめ情報