• ベストアンサー

sscanfの16進出力の逆処理

sscanfを使って char str[2]; int i; sscanf (str, "%x", &i) といった感じで文字列数値を16進に変換出来ますが 逆に16進を文字列数値に一発で変換する方法はないでしょうか 一発で出来なくてswitchなどで処理するしかないのでしょうか わかっている人には初歩的な質問かもしれないですが よろしくお願いします

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

printf又はsprintfで"%x"の書式を使います。 以下のようにしてください。 ------------------------------------ #include <stdio.h> main() { char str[16]; /* strは大きくとってください。最低でも9バイト以上*/ int i; /*画面に表示するなら以下のようにする。*/ i = 254; printf("%x\n",i); /*strに格納したいなら以下のようにする。*/ sprintf(str,"%x",i); /*これはstrに格納された内容を確認するため*/ printf("<%s>\n",str); } ------------------------------------------ 実行結果は以下の通り fe <fe>

condor2
質問者

お礼

ありがとうございます! さっそくやってみます

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.3

Cはしばらく触っていないので、もっといい方法があるかもしれませんが、 strtol関数とかどうでしょう? http://www.c-tipsref.com/reference/stdlib/strtol.html

condor2
質問者

お礼

すみません。流し読みだから違っているかも知れないですが、何となくchar→longな感じで私が質問している内容と逆な気がします。私の勘違いなら申し訳ないです。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> 文字列数値を16進に変換出来ますが この例は「16進数文字列を数値(int型整数)に変換」ですよね?単に「文字列数値」と言われたら、10 進数でのものが連想されます。 この逆変換、つまり「整数を16進数文字列に変換」なら、既にあるようにprintf系関数を使うのが楽でしょう。 16進数文字列変換に特化した関数を自作するにしても、大した手間ではありません sscanf (str, "%x", &i) で変換した i が「16進になる」と考えているのなら、誤解があります。 int型は数値しか記憶していません。それを10進数として扱うか、16進数として扱うかは、プログラム次第です。 i=10 ; printf("%x\n", i ) ; printf("%d\n", i ) ; i=0xa ; printf("%x\n", i ) ; printf("%d\n", i ) ; どちらも出力は同じです。

condor2
質問者

お礼

int型の16進についての詳しい説明ありがとうございます。 言われてみれば確かにint型なんだから数値として持ってるだけですね。 勘違いしてることがわかって助かりました (^^;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • sscanfでフォーマットに合っているかを調べるには。

    今,Cの関数で0-9,A-Zの4文字以内の文字列かどうか を調べたいのですが, int main() { int i; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; p = str; /* ここをstr1,str2に変える */ if (strlen(p) != 4) printf("エラーです\n"); for (i = 0; i < 4; i++) { if (!isupper(p[i]) && !isdigit(p[i])) { printf("えらーです\n"); return EXIT_FAILURE; } } printf("すべてOKです\n"); return EXIT_SUCCESS; } というようにすれば,strとstr1とstr2がフォーマットに合うかわかるのですが,これをsscanfの正規表現を使用して実装したいのですが,可能でしょうか。 int main() { int ret; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; chat tmp[30]; p = str; ret = sscanf(p, "%4[0-9A-Z]", tmp); if (ret != 1) { printf("エラーです\n"); return EXIT_FAILURE; } printf("すべてOKです\n"); return EXIT_SUCCESS; } といしょうとするならば,str1のときは,@までのABCの文字列がとれて,retには1が帰ってきてしまいます。 なにか4文字以内ということを実装できる正規表現の使い方はあるのでしょうか? ちなみに sscanf(str, "%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]", tmp1, tmp2, tmp3, tmp4) という以外でわかる方,よろしくおねがいします。

  • fgetsとsscanfの使い方

    初歩的な質問で申し訳ないのですが、fgetsとsscanfの使い方が合っているか確認願います fgets(char *s , int n ,FILE *fp); -> fpから1行(nで指定した文字数)読み込み、sに格納する sscanf(char buf, "%s", char string); -> bufから%sを読み込み、stringに格納する まだ使い慣れていないのでどっちから読み込むのかこんがらがってます 上記の解釈でよろしいのでしょうか?

  • sscanfより速い方法について。

    ただいま、テキストから書式付のデータを取得するコードを 書いております。 しかし、異常にその処理が遅いので、原因を調べてみると どうやらsscanfが原因らしいということが分かりました。 問題の箇所は以下のようになっております。 char*textBuf = NULL ・・・ (textBufにテキストの内容をロード) ・・・ for(int i=0;i<vertexNum ;++i ) {  float x, y, z;/*頂点座標になります*/  /*どうやらココが遅いようです。*/  sscanf( textBuf, "%f %f %f", &x, &y, &z );  vertexs_.push_back( Vector3(x, y, -z) );  textBuf = nextLine(textBuf);/*次の行に進みます。*/ } テキストには座標が格納してありそのフォーマットは 0.0 1.4 5.4 7.1 4.2 2.3 ・・・ のようになっております。 上記の方法では5000頂点の取得に12sec近くかかり とても使用に耐えられません。 何か解決方法をご存知の方がいらっしゃいましたら ご教授よろしくお願いします。

  • sscanfって・・・。

    #include<stdio.h> main() { char str[] = "aiueokkakikukekossashisusesottstituteto"; char a[20], b[20], c[20], d[20]; sscanf(str,"%[^k],%[^s],%[^t],%[^\0]",a,b,c,d); printf("%s\n",a); printf("%s\n",b); printf("%s\n",c); printf("%s\n",d); } 上のプラグラムでaはaiueoとちゃんと出力されるのですがb,c,dがちゃんと出力されないのはなぜでしょうか?与えられた文字を代える以外によい方法があれば教えてください。

  • sscanfの使い方について

    char *str = ./aa...a/b..bb/cc..c/d...dd.txt"; の aa...a , b..bb , cc..c , d...dd を取り出したいのですが sscanf(str,"./%s/%s/%s/%s.txt",a,b,c,d); とすると,aだけにすべての文字列が入ってしまい,他のb,c,dには何も入りません. つまり.a = "aa...a/b..bb/cc..c/d...dd.txt" となります. a,b,c,dはいずれも char a[512],b[512],c[512],d[512] となっております. 取り出すうまい方法がありましたら教えてください.

  • sscanf エラー

    sscanfで整数が読み込めません。 コマンドプロンプトの画面は以下のようです。 文章を入力してください。 aaaa 11 14 aaaa 4201776 4201870 1 以下が実行したコードです。 #include<stdio.h> int main(void){ int a,b,c,i; char name[20]; printf("文章を入力してください。\n"); scanf("%s",x); c=sscanf(x,"%s %d %d",name,&a,&b); printf("%s %d %d %d\n",name,a,b,c); return(0);} aaaa 11 14と表示されるように、御指摘おねがいします。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • fgets, sscanf, バッファ、ストリーム について

    ファイルからデータを入力するのに、fscanf の代わりに fgets と sscanf を用いようと考えています。 そこで、sscanf に与えるバッファ文字列を、ファイルストリームのように扱う方法は無いものでしょうか。 例えば以下のデータファイルに対して、以下のプログラムをうまく動作させるには、どのようにすればよいでしょうか。 どうぞ、よろしくお願いします。 (データファイル test.dat) n_data 4 1 3 8 4 (プログラム) #include <stdio.h> main() { int i, n_data, *data; char buf[100]; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); for( i=0; i<n_data; i++ ){ fgets(buf, 100, fp); sscanf( buf, "%d", &(data[i]) ); } sscanf( buf, "\n" ); close( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); } ちなみに、2行の fgets(buf, 100, fp); をコメントアウトして、 "sscanf( buf," を "fscanf( fp," に変更するとうまく動作します。

  • こんな処理は可能ですか?(動的な命名)

    以下のように、switchでnumの値を分岐させてその値ごとに tmp[j][i]に格納する変数を変えたいのですが、こういうことはもっと スマートにできないでしょうか? int num = (ランダムな数取得); for ( int j = 0; j < 100; j++ ){   for ( int i = 0; i < 100; i++ ){     switch ( num ){     case 1: tmp[j][i] = num1[j][i]; break;     case 2: tmp[j][i] = num2[j][i]; break;     case 3: tmp[j][i] = num3[j][i]; break;      ・      ・      ・     }   } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 上のコードを int num = (ランダムな数取得); char *str = "num"; strcat( str, (char *)num ); //文字列の連結 tmp[j][i] = (*str)[j][i]; 見たいな雰囲気でスマートにできるのではないかと思ったのですが・・。 動的な関数呼び出しとか##演算子とかそういうのと組み合わせてこんなことは 実現できないでしょうか?

  • sscanf() 関数の第 1 引数の型

     カーニハン/リッチー・著,石田晴久・訳の「プログラミング言語 C・第 2 版」で,「付録 B」にある sscanf() 関数のプロトタイプが   int sscanf(char *s, const char *format, ...) とあって,疑問に思いました。この第 1 引数の型は,「char *」ではなくで「const char *」のほうが合理的のように思えるのです。JIS X 3010-2003 では,const がついていましたし,さまざまな解説・マニュアルでも const つきで示されています。  そこで,ANSI C または JIS X3010-1993 の仕様書をお持ちの方,それらの仕様書の中で sscanf() 関数がどのようなプロトタイプを持っているか,ご教示願えませんでしょうか。ひょっとしたら本当に const がついていないのかもしれないし,書籍から何らかの理由で const が抜け落ちてしまったのかもしれません。  細かい点で恐縮ですが,ご回答くだされば幸いです。