
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No.1の回答に対する補足への回答です。
まず
"0x01,0x02,0x03,0x04"
という文字列を、
文字列 "0x01"、文字列 "0x02"、 ...
に分割します。そのために関数 strtok() を使います。
次に、文字列 "0x01" を数値の 1 に変換します。
関数 strtol() を使いましょう。
'1'を0x31と表示させたければ
printf("0x%02x", '1')
でOKです。
以上を踏まえてこんなかんじでどうでしょう。
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main(void)
{
char *p = "0x01,0x02,0x03,0x04";
char buff[20];
char *q;
strcpy(buff, p);
q = strtok(buff, ",");
while (q != NULL) {
char temp[3];
sprintf(temp, "%02d", strtol(q, NULL, 16));
printf("0x%02x,0x%02x,", temp[0], temp[1]);
q = strtok(NULL, ",");
}
return 0;
}
最後にもカンマが表示されるのは工夫しましょう。
No.3
- 回答日時:
あのう、じつはこの回答と、snotaさんの理解の仕方が間違ってるんですけど(^^;;;
http://www.okweb.ne.jp/kotaeru.php3?q=745688
>unsigned char *p;
>
>と宣言されています。
>このpに『0x01,0x02,0x03,0x04,0x05』や
>『"ABCDEF"』を代入したいと思っています。
まず、普通の変数とポインタ変数の違いを理解してくださいね。
C言語には、文字列を格納する変数はありません。
文字を配列として格納します。
>unsigned char *p;
ここで宣言しているpはアドレスを格納するための変数です。
つまり、
p = "ABCDEF";
とやっても、pに文字列が入っているわけではありません。
"ABCDE"が存在するアドレス値が入っているだけです。
実際に文字を変数に入れるには、まずcharやunsigned charの変数を配列として宣言する必要があります。
unsigned char c[6+1];
で、strcpy()等で格納します。
strcpy(c, "ABCDEF");
また、変数の宣言時に値の初期化をすることもできます。
この場合は、
unsigned char c[] = "ABCDEF";
と書くことにより、変数cの配列の要素にA、B、C、D、E、F、\0が入ります。
>このpに『0x01,0x02,0x03,0x04,0x05』や
ですが、これも、
unsigned char c[] = {0x01,0x02,0x03,0x04,0x05};
とすることで、配列cに初期値として代入することができます。
初期値として入れない場合は、
c[0] = 0x01;
c[1] = 0x02;
c[2] = 0x03;
c[3] = 0x04;
c[4] = 0x05;
とする必要があります。
で、
unsigned char c[] = {0x01,0x02,0x03,0x04};
の場合に
"01020304"としたいのであれば、
sprintf()を使うのが簡単です。
unsigned char c[] = {0x01,0x02,0x03,0x04};
char s[9];
sprintf(s, "%02x%02x%02x%02x",
(int)c[0], (int)c[1], (int)c[2], (int)c[3]);
で、sに"01020304"が入ります。

No.2
- 回答日時:
むりやりやってみました。
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main(void)
{
unsigned char *p = "0x01,0x02,0x03,0x04";
char str[20];
char *temp;
strcpy(str, p);
temp = strtok(str, ",");
while (temp != NULL) {
printf("%02d", strtoul(temp, NULL, 16));
temp = strtok(NULL, ",");
}
return 0;
}
No.1
- 回答日時:
p = "0x01,0x02,0x03,0x04";
ではなく
p = "0x30,0x31,0x30,0x32,0x30,0x33,0x30,0x34";
としなくては、『01020304』とは出力されません。
"0x01"とは16進数の01の事です。 toasciiを使用するのであれば、文字コードを設定して渡してあげます。
ちなみに0x30は十進数で48で、「0」の文字コードになります。0x31は「1」の文字コードになります。
最初のp = "0x01,0x02,0x03,0x04"; はあくまでも数字ですよ。もう少しお勉強しましょうね。
この回答への補足
申し訳ありません。自分なりに整理しました。
ASCII変換という表現が適切でないかもしれません。
最初の宣言などは特に変更はないのですが、
*p="0x01,0x02,0x03,0x04";
↓↓↓
0x30,0x31,0x30,0x32,0x30,0x33,0x30,0x34
と表示を行いたいのです。もう一度教えていただけませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
strncpyと_tcsncpy_sのヌルの扱...
-
fgetsなどのときのstdinのバッ...
-
ASCII変換について
-
CStringをwchar_tに変換したい
-
下記のプログラムがコンパイラ...
-
文字列から空白を取り除きたい...
-
文字列の中のカンマを消したい
-
引数の渡し方と受け方(argv)
-
scanf()について教えてください
-
PROCのコンパイルエラーの取り...
-
charからLPTSTRへの変換方法
-
double型の値をchar配列に変換...
-
至急!C言語文字列置換
-
テキストデータをそのままバイ...
-
間接操作のレベルとは
-
switch文で文字を比較すること...
-
COBOL->C(++)コンバータ
-
英単語をアルファベット順に
-
ネットワークにつながっている...
-
型変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
C言語の入力した文字を反転させ...
-
構造体のアライメント調整
-
strncpyと_tcsncpy_sのヌルの扱...
-
TCP/IP通信型大文字・小文字変...
-
char型からのバイト数取得
おすすめ情報