
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
- 1 char *str; と char* str;
- 2 C言語入門者です。今ポインタの勉強をしています。char *p=“123"と初期化し、後にp=“45
- 3 「char* p」と「char *p」は何が違うのでしょうか
- 4 for(s=p; *p; p++)の*p(ポインタ)の意味
- 5 配列[2][2]として int 加算=40; int a ; for(int x=0;x<3;x++
- 6 char*型が0x0を含む場合
- 7 H8マイコン C言語でのプログラミング *((volatile unsigned char *)ってなんですか??
- 8 char *p[20];
- 9 プログラミングについて int i,j,k k=0; for(i=1;i<=10;i++){ for
- 10 const unsigned char *Ptn
関連するカテゴリからQ&Aを探す
おすすめ情報
人気Q&Aランキング
-
4
ダブルクォーテーションを文字...
-
5
文字列の反転
-
6
CStringのFindで文字列検索を行...
-
7
VC++で文字列から任意の文字を...
-
8
文字列内の数字削除
-
9
strstrを利用しない文字列検索...
-
10
CreateProcess error=0
-
11
C# dataGridViewの値だけクリア
-
12
文字列str内の全ての数字を...
-
13
作ったプログラミングC何だけど...
-
14
'const char *' 型は 'char *' ...
-
15
長さ0の文字列を格納できません...
-
16
C言語でファイルから特定の文字...
-
17
textboxユーザーコントロールの...
-
18
if文の判定条件('||'と'&&'の使...
-
19
StringGridで選択した箇所の文...
-
20
CStringの文字列検索&抜き出し...
おすすめ情報