• ベストアンサー
  • 困ってます

16進数の文字列

16進数の文字列をそれと同値な整数値へ変換する関数をかけという問題なのですが、 この場合文字列を読み込んで、例えば読み込んだ値がABだとした場合、 A*16の1乗+B*16の0乗 を計算する関数を作ればよいのだと思うんですが、 それぞれの値をべき乗する関数も必要になってくると考えています。 そこで問題なのですが、べき乗の関数を作ったとして、それぞれの値(こんかいはAとB)にそれぞれのべき乗した値をかけてやるには、どういった方法があるのでしょうか? 回答よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数9
  • 閲覧数319
  • ありがとう数11

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

  • ベストアンサー
  • 回答No.7
  • notnot
  • ベストアンサー率47% (4602/9659)

#1です。 >ナル文字を使うと言うのが、あまり例題がなくわからなかったのですが、 Cの文字列操作の基本なので探せばいくらでもあると思います。プログラム中では'\0'でなく単に0と書かれているかもしれません。同じ値です。例えば、pがchar *だとして for( ; *p; ++p) putchar(*p); というのも0での文字列終端を調べてforループの終了条件としています。 >for文で、文字を検索しナル文字があれば、breakするループを作ればよいのでしょうか? それでいいと思います。 >もう少しプログラムが上達する方法と、 ある程度のレベルに達すれば他人の良く出来たプログラムを読むのがいいと思いますが、まだその域ではないようですね。当面は入門書のマスターでしょうか。 >この問題の大きな流れがあれば回答おねがいします。 文字列入力して、先頭からループで1文字ずつ調べながら値を16倍して足しこんでいくということでいいでしょうが、0-9A-Fa-f以外の文字があったらどうするかも考えねばなりません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

今現在プログラミング言語C(バイブルと呼ばれているやつ)をしています。 一応、入門書を購入して、一通り読み終えてから、バイブルに挑戦しているのですが、この本は簡単な部類に入る本なのですか? 毎日頑張っていますが、なかなか進みません。 どうもありがとうございました。

関連するQ&A

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

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

  • ”123456”といった整数を文字列に変換、その後、文字列を1文字ごとに整数に変換 

    忙しい中失礼します。 http://oshiete1.goo.ne.jp/qa3424254.htmlでも質問させて頂いたものですが、 今、回答してくださった方の意見を参考に以下の過程をこなそうとしています。 1.整数入力 →scanf関数を使用し、"123456"と入力します。 2.整数を文字列に変換 → printf("Write the SIN: \n");   scanf("%d", &fnum);   printf("%c\n",fnum); で、"123456"と数値を入力しても”123456”という値が返されず、@となってしまいます。 どうすれば入力した数値が文字列として返ってくるのでしょうか? どんな文・関数を使用すれば数字を文字列として使用することが可能になるのでしょうか? 今のところ習っている文はif else, swith case, while for,do whileで、 getcharやstr?(string)という関数は習っていません。なので、どうプログラムを書けばいいのか??さっぱりなのです。 でもgetcharやstr?(string)という関数を使用するしか方法はないものなのでしょうか?  また、それから 3.文字列を1文字ごとに整数に変換  にする場合、どんな文・関数を使用すれば、1文字”ごと”に整数に変換できるのでしょうか? ごめんなさい、分からないのです。プログラム文、ヒントもしくは参考になるページ等があれば教えて下さい。 よろしくお願いします。 <使用環境:フリーソフト(Borland?)C ANSI C>

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

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

その他の回答 (8)

  • 回答No.9

>unsignedというものが分からなかったので調べてみたのですが、符号なしとありました。 >これは、符号があればどうなるのでしょうか? 符号有りでつくるのであれば、文字列の桁数を固定する必要があります。 例えば2文字の16進数にするのであれば、ABは負の数ですね。 負の数である事の判定は先頭ビットが立っているか否かです。 >また、for文内の >for (i=0,j=strlen(x)-1,k=1 ;j>-1 ;j--,k*=16) >最後のk*=16なのですが、私の中では始めて見る書き方なのです。 >for文内に書いてもよいのですか? 書いても良いんですよ。 k *= 16 ; は k = k*16 ; と同じ意味です。 また16倍なので、 k = (k<<4); k <<= 4 ; というのも同じ事ですね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

i += (x[j]-'0')*k ; という部分を使わせていただいて、コンパイルしたのですが、16進数1111を入れてみたところ、17という値しか返ってきませんでした。 なぜなんでしょうか? 引き続き色々頑張ってみます。 お時間がありましたら、何か回答をいただけたらと思います。ありがとうございました。

  • 回答No.8
  • ara_ara
  • ベストアンサー率35% (124/348)

#5です。 よくご自分のソースを見てください。 i,jが混同していたり、hexstrも未定義です。 あなたのソースの修正箇所を下記に示しますので考えてみてください。 ・int s[3];  → int s[4];  ・for(j=0;j<=3;j++) → for(i=0; i<4; i++)  (i<=3 よりも i<4 とするのが普通です) ・for(n=0, i=0; i<strlen(hexstr); i++) {  → for(n=0, i=0; i<4; i++) {

共感・感謝の気持ちを伝えよう!

  • 回答No.6
  • notnot
  • ベストアンサー率47% (4602/9659)

#1です。 >文字をキーボードから得るには、scanfを用いるのがよいのか、それともgetcharを用いるのがよいのかがわかりません。 普通は、fgets で1行入力します。 scanfは意図通り使うことが難しい関数なので初心者は使わないほうがいいでしょう。ちゃんとしたC入門書では「使ってはいけない関数」と説明してあるはずです。 >そして、関数に文字を渡すときは、配列にして渡すのが普通なのでしょうか? 16進2桁とか決まっているなら2個のintでもいいです。 int hex_to_bin(int x, int y) のような。 桁数が可変である場合は char [] で'\0'で終端した文字列形式を使うのが普通でしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ナル文字を使うと言うのが、あまり例題がなくわからなかったのですが、 for文で、文字を検索しナル文字があれば、breakするループを作ればよいのでしょうか? 新しいことを知れば知るほど、この16進数の変換のプログラムの大きな流れがわからなくなってきます。 なにか、もう少しプログラムが上達する方法と、この問題の大きな流れがあれば回答おねがいします。 なんどもすいません。

  • 回答No.5
  • ara_ara
  • ベストアンサー率35% (124/348)

>c-'0' と言う部分なんですが、 cは文字コードになっていることはわかりますよね。 '0'は、'0'の文字コード(ASCIIコードで0x30=48)です。 ASCIIコードでは、'0','1',...と並んでいるので'0'~'9'のコードなら そのコード(c)から'0'のコードを引くと文字を数値に変換したことになりますよね。 ・'0'-'0'=0 ・'1'-'0'=1  ... ・'9'-'0'=9 'A'~'F'の部分は自分で考えてください。(ほとんど同じですが)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

'A'~'F'の部分は意味の理解し、自分なりのプログラムを作ってみたのですが、内容はara_araさんの内容と同じです。そこで、コンパイルしたところ int main(void) { int i,j,n; int s[3];  for(j=0;j<=3;j++)  s[i]=getchar();  for(n=0, i=0; i<strlen(hexstr); i++) {   n *= 16;   n += hex2bin(s[i]);  }  ・・・ } の、n += hex2bin(s[i]); の部分で、s[i]が、引数として渡せないとエラーが出ます。 この部分をどういう風に書き換えれば、エラーがでずにコンパイルすることが出来るでしょうか? 何度もすいません。

  • 回答No.4

整数値としか無かったので取り急ぎunsigned intで書いてみました。 unsigned int xtou(char x[]) {   unsigned int i ;   int j,k ;   for (i=0,j=strlen(x)-1,k=1 ;j>-1 ;j--,k*=16){     if ( x[j] >= '0' && x[j] <= '9' ){       i += (x[j]-'0')*k ;     } else if ( x[j] >= 'a' && x[j] <= 'f' ){       i += (x[j]-'a'+10)*k ;     } else if ( x[j] >= 'A' && x[j] <= 'F' ){       i += (x[j]-'A'+10)*k ;     } else {       fprintf(stderr,"Error : xtou(\"%s\");\n",x);       exit(1);     }   }   return i ; }

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。 unsignedというものが分からなかったので調べてみたのですが、符号なしとありました。 これは、符号があればどうなるのでしょうか? また、for文内の for (i=0,j=strlen(x)-1,k=1 ;j>-1 ;j--,k*=16) 最後のk*=16なのですが、私の中では始めて見る書き方なのです。 for文内に書いてもよいのですか? もしよろしかったら、回答お願いします。 ありがとうございました。

  • 回答No.3
  • ara_ara
  • ベストアンサー率35% (124/348)

こんな感じでどうでしょうか? (0-9、A-F以外が含まれる場合は省略しています) int hex2bin(char c) {  if(('0'<=c) && (c<='9'))   return c-'0';  if(('A'<=c) && (c<='F'))   return c-'A'+10;  return -1;/* 0-9,A-F でない */ } int main(void) {  char hexstr[]="ABCD";  inti, n;  for(n=0, i=0; i<strlen(hexstr); i++) {   n *= 16;   n += hex2bin(hexstr[i]);  }  ・・・ } 動かしていないので自信なしということにしておきます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。 ひとつ疑問におもったのが c-'0' と言う部分なんですが、以前にも何かの本でこのような部分があり、どういうことをしているのかが、わからなかったのですが、これはどういうことをしているのでしょうか? よろしかったら、回答おねがいします。

  • 回答No.2

ロジックを解析してみてください。 納得できれば、プログラムに起こすだけです。 関数開始 (文字列へのポインタを引数に渡す) 文字数だけループさせる i番目の文字を判定 '0'の場合0 '1'の場合1 '2'の場合2 ・・・ 'F'の場合15 X=(X * 16)+上で判定した数値 ループ終了 Xを返す 関数終了 ※Xは返り値を保存する変数 iはループ変数

共感・感謝の気持ちを伝えよう!

質問者からのお礼

文字を判定する場合、switch文を用いてcaseの分岐によってそれぞれに値を与える、と最初に考えついたのですが、みなさんの回答にあるように c-'0' といった式で繰り返し数値を与えるものが、もっとも効率のよいプログラムになるのでしょうか? もっと斬新な、方法があれば教えてください。 よろしくおねがいします。 どうもありがとうございました。

  • 回答No.1
  • notnot
  • ベストアンサー率47% (4602/9659)

>べき乗の関数を作ったとして、それぞれの値(こんかいはAとB)にそれぞれのべき乗した値をかけてやるには、どういった方法があるのでしょうか? 単に * で掛ければいいと思うのですが、どのあたりが問題と思っているのでしょうか? 16進数 ABCD を A*16^3+B*16^2+C*16^1+D というのが質問中に書かれた方法ですが、 ((A*16+B)*16+C)*16+D というのがよくプログラムで使われる方法です。前者の方法に比べて 1) 16を掛けて足すという繰り返し処理でいい 2) 最初に全体の桁数を調べなくて良い という利点があります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど!という一言に尽きる回答をありがとうございました。 いざ、関数の中身がわかったところで、ソースを書いていたんですが、文字をキーボードから得るには、scanfを用いるのがよいのか、それともgetcharを用いるのがよいのかがわかりません。 そして、関数に文字を渡すときは、配列にして渡すのが普通なのでしょうか? なんどもすいません。よろしければ回答おねがいします。

関連するQ&A

  • 文字列から整数導き出したい

    お世話になります。 現在、簡易的な占いのプログラムを作ってみています。 フォームに入力された文字から占いの結果を表示するようなものを 作りたいのですが、中々うまくいきません。 仕組み的にはフォームから文字列をPOST⇒10進数の整数に変換⇒10進数の整数に対応する占い結果を表示という形を考えています。 文字列をbin2hex関数で16進数にはできるのですが、16進数から10進数変換する方法がわかりません。 何かより方法がありましたらご教授ください。

    • ベストアンサー
    • PHP
  • 文字列の置換

    VB6で開発してます。 以下のようなことをやりたいのですが、 効率のよい方法はないものでしょうか? <やりたいこと>  文字列1の中にある『_』と同じ位置にある  文字列2の文字を『_』に置き換えたい。  [変換前]   文字列1:12_3456_   文字列2:ABCDEFGH  [変換後]   文字列1:12_3456_   文字列2:AB_DEFG_ どなたかわかる方がいらっしゃったら教えて下さいm(_ _)m 

  • 10進数を表す文字列を整数型に

    "0x10"(16進数) や "020"(8進数) などは oct関数で整数型に直せますが、 10進数の文字列を整数型に直す関数はありませんか?

    • ベストアンサー
    • Perl
  • A列の文字列からB列の文字列を

    A列の文字列からB列の文字列を 引く(マイナス)することはできないでしょうか? 例) A列 - B列 - C列 ABCD - CD - AB ABCD - BCD - A ABCD - GH - ABCD という風にC列に関数で結果を表示したいのです。 方法はないでしょうか? よろしくお願いします。

  • テーブルの設計はとりあえず文字列で取り込み?

    テーブルの設計はとりあえず文字列で取り込み? こんにちは。会社の上司にSQLについて教えてもらいました(ACCESS2003)。 上司曰く、とりあえずテーブルの設計はvarcharにしておけば大丈夫。 もし取り込んだ値が数値なら、あとで数値に変換する関数で数値に変換して計算行えばいいよと言われました。 とりあえず、文字列なら必ずインポートできるからテーブルのデータ型は全て文字列型。 というのは正しいのでしょうか?様々な型があるのに、すべて文字列型にしてもいいのかなと素朴な疑問が生まれました。 よろしくお願いします。

  • 文字列を%+2桁のヘキサ

    の列に変換するPHPの関数はあるでしょうか? foo.php?x= の後につける文字列を作りたいのです ここに置けない文字列があると困るので変換しておきたいのです

    • ベストアンサー
    • PHP
  • 文字列の数字を計算したい

    初歩的な質問で申し訳ありませんが お願いします。 VB2005EXPRESSで、 文字列の『1』を整数の『1』に、 文字列の『245』を整数の『245』に 変換する関数を教えていただけますか? TextBox2.Text = (TextBox2.Text) + (TextBox1.Text) 1+1が11になります! 一応、ヘルプで調べ 『strtol 文字列を長整数型 (long) に変換します。』 とあったので、 TextBox2.Text = strtol(TextBox2.Text) + strtol(TextBox1.Text) としたら、 名前strtolが宣言されていません。というエラーが出ました。

  • 一番初めに文字列が入っている列の文字列を知りたい

    次の条件で、よりA列に近い文字列を引っ張り出すにはどのような関数を使えば良いのでしょうか? 1)行の中にそれぞれ"文字列"が入っている 2)文字列が入っているセル数は行によって異なる   【A】 【B】 【C】 【D】 【E】 【1】りんご 【2】   ばなな 【3】   みかん りんご 【4】ばなな           みかん この回答を【F】列に示す場合、 【F1】はりんご、【F2】はばな、【F3】はみかん、【F4】はばなな、になって欲しいのです。 上手く質問できないのですが、とても困っています。宜しくお願いします。

  • 文字列と整数型について

    はじめまして。 どうしても困っているのでヒントでも良いのでおねがいします。 関数内(func1)で確保した文字列変数のポインタを 別の関数(func2)にポインタ渡しします。 func2内で整数型で計算した結果を引数で示された文字列変数に 代入するというようなことをしたいと思ってます。 ここで、intは4byteとします。 メモリ長だけで見ると、bit[4] = tmp です。 void func1(){ char bit[4]; func2(bit); return; } void func2(char* p){ int tmp = 0x10101100; p = tmp; <---- ??? return; } そこでどのようにすれば、 代入することができるのか分かりません。 以下のような結果になるように代入したいと思っています。 bit[0] = 0x10; bit[1] = 0x10; bit[2] = 0x11; bit[3] = 0x00; 小さな文字列型に整数型をどのように渡せばよいのかが 一番疑問に思っているところです。 整数型に文字列型を代入する場合には 文字列のバイト指定とシフト演算で実現できています。 ヒントでもよいのでお願いします。

  • 整数を文字列として認識したい

    整数を文字列として認識したいんですが、可能なのでしょうか? 例えば、i=12470というint型の整数があるとして、1万の位の数1や、十の位の数7だけを取り出したいんです。 しかし、この際、1万の位の数1をi/10000、十の位の数7を(i%100)/10などというようにしては取り出したくないんです。 ややこしい質問ですが、よろしくお願いします。 というのも、整数を文字列として認識する目的は、int型として送られてきたデータが本当に整数なのかをチェックするためだからです。 初心者なので合っているか分かりませんが、整数を文字列として認識できれば、isdigit関数を使うことで、データが本当に整数なのかをチェックすることができるのかなあと考えているんですが・・・ もし、私の考えが間違っていたり、他に良い方法があったら是非教えて欲しいと思います。