質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

6145閲覧

C言語での16進数1ABF2454F185の分割と整数への変換

tanakakazuki

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/15 09:31

前提・実現したいこと

C言語で16進数の文字列
1ABF2454F185
を2文字ずつ分割して、int形に格納し整数表示したいです。
イメージとしては
int a[6]
a[0]=26, a[1]=191,…, a[5]=133

発生している問題・エラーメッセージ

2文字ずつの分割方法とそれを配列に格納する方法が分かりません。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3void main() 4{ 5 char* str[] = "1ABF2454F185"; 6 char Sbuf[2]; 7 int len = (int)strlen(str) / 2; 8 9 while (i < len) 10 { 11 sscanf(str, "%2s", Sbuf); 12 printf("%s", Sbuf); 13 i++; 14 } 15 puts(""); 16}

試したこと

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11117477906
を参考に分割を試したのですが各値を配列に格納する方法が分からないです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

基数を指定して文字列を数値に変換するstrtoulという関数があります。


char Sbuf[2];
NULL文字が付くため、2ではバッファサイズが足りません。


なるべく元のコードに沿って書くと、

C

1#include <stdio.h> 2#include <string.h> 3void main() 4{ 5 char* str = "1ABF2454F185"; 6 char Sbuf[3]; 7 int len = (int)strlen(str) / 2; 8 int i = 0; 9 int a[6] = { 0 }; 10 while (i < len) 11 { 12 sscanf(&str[i*2], "%2s", Sbuf); 13 a[i] = strtoul(Sbuf, NULL, 16); 14 printf("a[%d]=%d\n", i, a[i]); 15 i++; 16 } 17}

結果

a[0]=26 a[1]=191 a[2]=36 a[3]=84 a[4]=241 a[5]=133

投稿2020/06/15 09:46

編集2020/06/15 10:03
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"%2x"で読めば2文字ずつ取り分ける必要は無いです。

C

1#include <stdio.h> 2 3int main() 4{ 5 char str[] = "1ABF2454F185"; 6 char *p; 7 int a[100]; 8 int ia, i; 9 int n; 10 11 for(ia=0,p=str; ; ia++,p+=n*2){ 12 n=sscanf(p, "%2x", &a[ia]); 13 if(n!=1) break; 14 } 15 16 for(i=0; i<ia; i++){ 17 printf("a[%d] = %d\n",i,a[i]); 18 } 19 20 exit(0); 21}

投稿2020/06/15 11:25

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sscanf を使うと、

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char s[] = "1ABF2454F185"; 6 int a[6]; 7 sscanf(s, "%2x%2x%2x%2x%2x%2x", a, a+1, a+2, a+3, a+4, a+5); 8 for (int i = 0; i < 6; i++) printf("a[%d] = %d\n", i, a[i]); 9}

追記
16進数文字列の長さが分からない時、

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char s[] = "1ABF2454F185"; 6 int a[100], n = 0; 7 while (n < 100 && sscanf(s + n*2, "%2x", a + n) == 1) n++; 8 for (int i = 0; i < n; i++) printf("a[%d] = %d\n", i, a[i]); 9}

16進数文字列の長さが奇数の時、最後は 1文字の値になります。

投稿2020/06/15 10:49

編集2020/06/16 02:40
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

元のコードに沿った回答がすでに出ているので、沿ってないやつを。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <ctype.h> 4 5int htoi(int ch); 6 7int main(void) 8{ 9 char *str = "1ABF2454F185"; 10 char *ptr = str; 11 int result[100]; 12 int index = 0; 13 14 while (*ptr != '\0') { 15 if (*(ptr + 1) != '\0') { 16 result[index++] = htoi(*ptr) * 16 + htoi(*(ptr + 1)); 17 } else { 18 result[index++] = htoi(*ptr); 19 break; 20 } 21 ptr += 2; 22 } 23 for (int i = 0; i < index; i++) { 24 printf("result [%d] is %d\n", i, result[i]); 25 } 26 return 0; 27} 28 29int htoi(int ch) 30{ 31 if (isdigit(ch)) { 32 return ch - '0'; 33 } else if (isxdigit(ch)) { 34 return ch - (ch < 'a' ? 'A' : 'a') + 10; 35 } 36 exit(1); 37}

投稿2020/06/15 10:45

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問