• ベストアンサー

文字列→数値変換関数

・数字文字列を数値化する関数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#169100
noname#169100

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

  • ベストアンサー
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

  • 文字列

    ・数字文字列を数値化する関数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); } です。 自分自身で、正の整数はできました。見てください。そして、負の整数や、「int *pRetCode」の使い方をおしえてください。 #include <stdio.h> short AtoS(cahr *pStr, int *pRetCode); void main(void) { short val; int code; val = AtoS("1234", & code); printf("%d\n", val); val = AtoS("-789", & code); printf("%d\n", val); } short AtoS("char *pStr, int *pRetCode) { short suu; suu = 0; while("\n" != *pStr) { suu = *pStr - '0' + suu * 10; pStr++;   } return(suu); } までしかできません。どなたか教えてください。  

  • 数値→文字列変換関数

    ・数値を文字列化する関数StoAを作成する。 書式:char *StoA(short nVal); 引数:short nVal; 文字列化する数値 戻り値:数字文字列のポインタ 処理:nValで与えられたshort型の数値を文字列に変換し、そのポインタを返す。 呼び出し側の書式は以下の通り。 void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } です。自分で途中までしたので見てください。 #include <stdio.h> cahr *StoA(short nVal); void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } char *StoA(short nVal) { ここからがわかりません。どなたか助けて下さい。

  • 数値→文字列変換関数

    ・数値を文字列化する関数StoAを作成する。 書式:char *StoA(short nVal); 引数:short nVal; 文字列化する数値 戻り値:数字文字列のポインタ 処理:nValで与えられたshort型の数値を文字列に変換し、そのポインタを返す。 呼び出し側の書式は以下の通り。 void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } です。明日までの専門学校の課題なのでどうか、どなたか助けて下さい。

  • 関数に文字列を渡すことについて

    参考書にあったプログラムなのですが、 ------------------------------------------- #include<stdio.h> void strout(char ss[ ]); int main(void) { char st[ ]="ABCDEF"; strout(st); strout("ABab12"); return 0; } void strout(char ss[ ]) { int i; printf("ss=%s\n",ss); i=0; while(ss[i]){ printf("%X ",ss[i]); ++i; } printf("\n"); } ---------------------------------------------- ------------実行結果--------------- ss=ABCDEF 41 42 43 44 45 46 ss=ABab12 41 42 61 62 31 32 ----------------------------------- 初心者という事で、いろいろと疑問があるのですが、 ◎1「stとして、文字配列をss[ ]に渡すのと、"ABab12"として直接文字列をss[ ]に渡すのはとは、どういうことなのかということ。そしてその時ss[ ]はどうなっているか?」 ◎2「実行結果で、最初のprintfからループさせなくてもss=ABCDEF、ss=ABab12が何故2つとも表示され、2つとも16進数が表示されるのか?」 ◎3「while(ss[i])だけで何故、'\0'でない間ループするという事が出来てしまうのか?」 以上のような疑問があります。 先頭のアドレスを渡すといったような説明はあるのですが、いまひとつ分かりません。 教えていただけると嬉しいです。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

  • 配列要素内の数値

    #include <stdio.h> int main(void) { int arr[1]={123456789}; int *x[1]; *x = arr; printf("%d ",*(x[0])); /* 123456789 と表示*/ return 0;} 実行すると123456789と表示されるまでは分かるのですが、*(x[0])の部分を別の書き方にして、arr[0]に入ってある「123456789」という数値の千の値である6という数値のみを取り出して、表示することは可能なのでしょうか?(6000と取り出したいのではなく、6として取り出したい) 次のように数値を文字列の一つ一つを扱うかのように、扱いたいのです。*(x[0])の部分の変更だけで6を取り出せるような方法はありますか? #include <stdio.h> int main(void) { char *arr[]={"pen"}; printf("%c\n",*(arr[0]+0)); printf("%c\n",*(arr[0]+1)); printf("%c\n",*(arr[0]+2)); return 0;}

  • 動的に生成した文字列の配列を返す関数について

    動的に生成した文字列の配列を返す関数について お世話になります。 動的に文字列の配列を生成する関数を作ったのですが、 配列をうまく受け渡すことができず困っています。 以下のように入力された件数の数だけ "abc 0"~"abc n"という文字列を生成を行っています。 関数自体は期待通りの動作をしているようなのですが、 (Test1関数の最後でbfを確認しました) 呼び出し側にうまく配列を渡すことができません。 以下にソースを掲載いたしますのでどなたかご教示いただけたらと思います。 環境はVisualStudio2005です。 よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> void Test1(char **bf, int *cnt) { int i; int kensu; int charlength; char num[10]; char **nm1 = NULL; char **nm2 = NULL; printf("件数を入力:"); scanf("%d",&kensu); for(i=0; i < kensu; i++) { nm2 = (char**)realloc(nm1, sizeof(char*) * (i + 1)); nm1 = nm2; charlength=128; nm1[i] = (char*)malloc(sizeof(char) * (charlength)); strcpy(nm1[i], "abc "); itoa(i, num, 10); strcat(nm1[i], num); } bf = nm1; *cnt = i; return ; } void main() { int cnt; char **bf = NULL; Test1(bf, &cnt); printf("START\n"); printf("全部で%d件。\n", cnt); for(int i=0;i < cnt;i++) { printf("%s\n",bf[i]); } free(bf); printf("END\n"); }

  • 文字列をうまく返してくれない

    数値を文字列として呼び出し元に渡し、呼び出し元で文字列を数値に変えようとしたのですがatoi関数(strtolを使うと最初の文字のみ帰ってくるため2桁以上の数値に対応できない)を使うとうまく行きませんでした。 どのように変更したらatoiが使える文字列になりますか? #include <stdio.h> #include <stdlib.h> static struct{   char *name; }kuda[5]={   { "もも" , "りんご" , "みかん" , "バナナ" , "パイナップル" } } char *re_3( void ){   int a = 3;   char str_h[100];   char *str;   sprintf_s( str_h , 100 , "%d" , a );   *str = *str_h; //原因はおそらくここ   return str; } void main( void ){   printf( "%s" , kuda[ atoi( re_3() ) ].name ); }

  • "文字列"に関数を埋め込めるか

    VBで人が作ったソースを読んでいました。 lbuf = New String() {"*「そなたが つぎのレベルになるには", _ "  あと " & NumberStringToWide(dist.ToString()) & "ポイントの", _ "  けいけんが ひつようじゃ。", _ 見たいなコードがあって、どうやら文字列に関数を埋め込んでいたみたいです。 C言語でこれに相当することはできますでしょうか? 説明しやすいように分かる範囲で書いてみました。 #include <stdio.h> char *Message[] = { "次のレベルアップは /*ここに関数*/ です", } int numget( void ){ return 100; } int main( void ){ printf("%s", Message[0]); return 0; }

  • 文字の数値化 関数化

    文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }

専門家に質問してみよう