【最大10000ポイント】当たる!!質問投稿キャンペーン!

16進数の文字列をそれと同値な整数値へ変換する関数をかけという問題なのですが、

この場合文字列を読み込んで、例えば読み込んだ値がABだとした場合、

A*16の1乗+B*16の0乗

を計算する関数を作ればよいのだと思うんですが、
それぞれの値をべき乗する関数も必要になってくると考えています。

そこで問題なのですが、べき乗の関数を作ったとして、それぞれの値(こんかいはAとB)にそれぞれのべき乗した値をかけてやるには、どういった方法があるのでしょうか?

回答よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

#1です。


>ナル文字を使うと言うのが、あまり例題がなくわからなかったのですが、
Cの文字列操作の基本なので探せばいくらでもあると思います。プログラム中では'\0'でなく単に0と書かれているかもしれません。同じ値です。例えば、pがchar *だとして
for( ; *p; ++p) putchar(*p);
というのも0での文字列終端を調べてforループの終了条件としています。

>for文で、文字を検索しナル文字があれば、breakするループを作ればよいのでしょうか?
それでいいと思います。

>もう少しプログラムが上達する方法と、
ある程度のレベルに達すれば他人の良く出来たプログラムを読むのがいいと思いますが、まだその域ではないようですね。当面は入門書のマスターでしょうか。

>この問題の大きな流れがあれば回答おねがいします。
文字列入力して、先頭からループで1文字ずつ調べながら値を16倍して足しこんでいくということでいいでしょうが、0-9A-Fa-f以外の文字があったらどうするかも考えねばなりません。
    • good
    • 0
この回答へのお礼

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

どうもありがとうございました。

お礼日時:2004/01/12 23:05

>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 ;
というのも同じ事ですね。
    • good
    • 0
この回答へのお礼

i += (x[j]-'0')*k ;
という部分を使わせていただいて、コンパイルしたのですが、16進数1111を入れてみたところ、17という値しか返ってきませんでした。

なぜなんでしょうか?
引き続き色々頑張ってみます。
お時間がありましたら、何か回答をいただけたらと思います。ありがとうございました。

お礼日時:2004/01/12 23:00

#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++) {
    • good
    • 0

#1です。


>文字をキーボードから得るには、scanfを用いるのがよいのか、それともgetcharを用いるのがよいのかがわかりません。

普通は、fgets で1行入力します。
scanfは意図通り使うことが難しい関数なので初心者は使わないほうがいいでしょう。ちゃんとしたC入門書では「使ってはいけない関数」と説明してあるはずです。

>そして、関数に文字を渡すときは、配列にして渡すのが普通なのでしょうか?

16進2桁とか決まっているなら2個のintでもいいです。
int hex_to_bin(int x, int y) のような。
桁数が可変である場合は char [] で'\0'で終端した文字列形式を使うのが普通でしょう。
    • good
    • 0
この回答へのお礼

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

なにか、もう少しプログラムが上達する方法と、この問題の大きな流れがあれば回答おねがいします。
なんどもすいません。

お礼日時:2004/01/12 15:38

>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'の部分は自分で考えてください。(ほとんど同じですが)
    • good
    • 0
この回答へのお礼

'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]が、引数として渡せないとエラーが出ます。
この部分をどういう風に書き換えれば、エラーがでずにコンパイルすることが出来るでしょうか?
何度もすいません。

お礼日時:2004/01/12 15:33

整数値としか無かったので取り急ぎ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 ;
}
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
unsignedというものが分からなかったので調べてみたのですが、符号なしとありました。
これは、符号があればどうなるのでしょうか?

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

お礼日時:2004/01/12 15:44

こんな感じでどうでしょうか?


(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]);
 }
 ・・・
}

動かしていないので自信なしということにしておきます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/12 02:30

ロジックを解析してみてください。


納得できれば、プログラムに起こすだけです。

関数開始
(文字列へのポインタを引数に渡す)

文字数だけループさせる

i番目の文字を判定
'0'の場合0
'1'の場合1
'2'の場合2
・・・
'F'の場合15

X=(X * 16)+上で判定した数値
ループ終了

Xを返す

関数終了

※Xは返り値を保存する変数
iはループ変数
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/12 15:50

>べき乗の関数を作ったとして、それぞれの値(こんかいはAとB)にそれぞれのべき乗した値をかけてやるには、どういった方法があるのでしょうか?



単に * で掛ければいいと思うのですが、どのあたりが問題と思っているのでしょうか?

16進数 ABCD を A*16^3+B*16^2+C*16^1+D というのが質問中に書かれた方法ですが、
((A*16+B)*16+C)*16+D というのがよくプログラムで使われる方法です。前者の方法に比べて
1) 16を掛けて足すという繰り返し処理でいい
2) 最初に全体の桁数を調べなくて良い
という利点があります。
    • good
    • 0
この回答へのお礼

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

そして、関数に文字を渡すときは、配列にして渡すのが普通なのでしょうか?

なんどもすいません。よろしければ回答おねがいします。

お礼日時:2004/01/12 02:22

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q16進数から2進数へ

16進数の文字列を2進数に変換して、int型の配列に1or0で書き込んでいきたいんですが、どうすればいいのかわかりません。よろしくお願いします。

Aベストアンサー

即席ですが。ctype.hとかstdlib.hとか要ると思います。
戻り値>=0で正常終了。その場合は書き込まれた長さ(使った配列の要素数)が返ります。

int hexToBinary(char* src, int* dest) {
char c;
int x, i;
char* p = src;
while(*p != NULL) {
c = tolower(*p);
if (isdigit(c)) {
x = c - '0';
} else if (c >= 'a' && c <= 'f') {
x = c - 'a' + 10;
} else {
return -1;
}
for (i=0; i<4; i++,x>>=1) {
dest[3-i] = x & 1;
}
p++;
dest+=4;
}
return (p-src)*4;
}

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

QHEX2BIN関数の使い方。

HEX2BINを使用して16進数4桁を2進数に変換しようとしたところ=HEX2BIN(B2) (B2セルは6F67)としたところ#NUMエラーが出てしまいます。

B2を”B2”にすれば変換ができたのですが今度はオートフィルが使えなくなってしまいます。

なので、=HEX2BIN(B2)で変換できる方法か””をつかってもオートフィルで=HEX2BIN("C2")などにする方法を教えて下さい Excelは2007です。

Aベストアンサー

> としたところ#NUMエラーが出てしまいます。

ヘルプでは数値に指定できるのは40ビットってなってますが、~1FFより大きい16進数は指定できません。


> B2を”B2”にすれば変換ができたのですが

B2セルの内容でなくて、B2という16進数を変換しています。
セル指定してるわけでないので、オートフィル出来ないのは自明。


> なので、=HEX2BIN(B2)で変換できる方法か

B2セルに、
1FF
B2
なんかの桁数の少ない16進数を指定するか、2バイトずつ桁数分けて2進数にするとか。
必ず4桁の16進数が指定されるのなら、
=HEX2BIN(LEFT(B2,2),8)&HEX2BIN(RIGHT(B2,2),8)
とか。

Qchar*を初期化したいのですが

Cの標準関数だけで
char*を初期化したいのですが
どの様にすればいいのでしょうか?

char* a = "aaaa";
char* b = "bbbb";
strcat( a, b );//"aaaabbbb"?
とし使いまた後で
aにまた値を入れ直したいので
初期化して再利用したいのですが

どのようにすればいいのでしょうか?

ポインタとかもうっすら(ほとんどわかりません)
よろしくお願いいたします

Aベストアンサー

> char* a = "aaaa";
> char* b = "bbbb";
> strcat( a, b );//"aaaabbbb"?
この上のコードは間違っていますよ。
変数a、bに入っているのはあくまでも文字列の"ポインタ"です。
従いまして、strcat( a, b );とすると、aがさしているメモリは5バイトしかないのでメモリを破壊してしまいます。
static char sza[] = "aaaa";
static char szb[] = "bbbb";
char szBuffer[256];
char* a = szBuffer;
strcpy (a, sza);
strcat (a, szb);
としないとだめです。

またポインタ変数はNULLで初期化可能です。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Q文字列で条件分岐 if swtich

C言語でifやswitch文の条件式でキーボード入力からの複数文字列(char型)に対して条件分岐をしたいのですが、どなたか具体例を教えていただけないでしょうか?またscanfでキーボード入力を読み込む場合、Enterを押さないと実行されませんが、Enterを押さないでもいい関数や方法があれば教えて下さい。宜しくお願いします。

Aベストアンサー

>複数文字列(char型)に対して条件分岐をしたいのですが、

char buf[10];
scanf("%s", buf);
if ( buf == "hello" ) { ... }

みたいなコトがしたいのでしょうか?

if ( strcmp(buf, "hello") == 0 ) { ... }

とかで我慢して下さい。

Q16進数を2文字ずつ配列に格納したい

16進数を配列に格納するのに2文字ずつ格納したいのですがどうしたらいいですか。
例えば
num=ef23157をa[0]=57,a[1]=31,a[2]=f2,a[3]=0e,
のように1バイトずつ格納したいのですが、方法がわかりません。
お願いします。

Aベストアンサー

答えを教えるのは禁止されてるのでヒントだけ

「&」と「>>」

QTera Term で 「接続が拒否されました」

VMWare上のCentOS5.4にTeraTermからSSH2で接続したいのですが、
「接続が拒否されました」と表示されアクセスできません。
ホストOSはWindowsXPです。

VMWareの設定はBrdgeで、
ネットやpingは通過します。
またBUFFALOのルーターを使用していますが、22番ポートは開いています。
Windowsのファイアーウォールをきっても接続できません。

sshd_configは特に変更なし。
hosts.allowは
 ALL : 127.0.0.1
 sshd : [WindowsのIP]
ためしにiptables -Fや、sshd restartしましたが、
変化はないです。

どのようにすれば、接続することができるでしょうか?

Aベストアンサー

まず、CentOS5.4上から、
slogin [CentOS5.4に割り当てたプライベートIP]
もしくは
telnet [CentOS5.4に割り当てたプライベートIP] 22
で接続ができますか?
できればCentOS5.4上の設定は問題なし
できなければCentOS5.4上の問題

もしできたとして、ルータの設定ですが、

> またBUFFALOのルーターを使用していますが、22番ポートは開いています。

フィルタの設定だけでなく、
WAN側のIPアドレス:22→CentOS5.4に割り当てたプライベートIP:22
というポートフォーワーディング(ポート開放)の設定をしていますか?


人気Q&Aランキング