C言語の質問です(C言語初心者なのでわかりやすくお願いします)

1.文字列型をshort型に変換する方法
2.MACアドレス文字列(AA:BB:CC:DD:EE:FF)をchar型の配列に格納する方法

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/12/17 11:42:20
  • 終了:--

回答(4件)

id:oddfancy No.1

oddfancy回答回数10ベストアンサー獲得回数02004/12/17 12:30:15

ポイント10pt

1. atoiという関数を使います

#include <stdlib.h>

short s = (short)atoi(”12345”);

2. こんなの例ではどうでしょうか。

#include <stdio.h>

int main(int argc, char** argv)

{

const char* ptr = ”AA:BB:CC:DD:EE:FF”;

char tmp[6][3];

int i;

for( i = 0; i < 6; i++ ){

tmp[i][0] = ptr[0];

tmp[i][1] = ptr[1];

tmp[i][2] = ’¥0’;

ptr += 3;

}

for( i = 0; i < 6; i++ ){

printf(”%s¥n”, tmp[i]);

}

return 0;

}

id:wm5775 No.2

wm5775回答回数351ベストアンサー獲得回数42004/12/17 11:48:37

1.

char a = ’a’;

short i = 0;

i = (short)a;

2.

char address[] = ”AA:BB:CC:DD:EE:FF”;

id:neige_larme

すいません例を挙げておけば良かったですね。

1番目のは一文字ですが文字列なので”123”でも可能なのですか?

2番目のは「AA」「BB」ごとに配列に格納したいのですが。

2004/12/17 11:54:03
id:aki73ix No.3

aki73ix回答回数5224ベストアンサー獲得回数272004/12/17 12:14:20

ポイント50pt

http://www.hatena.ne.jp/1103251340#

人力検索はてな - C言語の質問です(C言語初心者なのでわかりやすくお願いします) 1.文字列型をshort型に変換する方法 2.MACアドレス文字列(AA:BB:CC:DD:EE:FF)をchar型の配列に格納する方..

1.

short a;

char test[]=”1234”;

a=atoi(test); /* stdlib.hをincludeすること 文字列を数値に変換します*/

2.

int i;

char MAC[256]=”AA:23:4e:58:69:02”;

char mac2[6][3];

for(i=0;i<6;i++){

//数値の先頭のポインタ取得(3字ごとにあるので0,3,6,9,12,15文字目が該当)で2も事実コピー

strncpy(mac2[i],MAC+i*3,2);

mac2[i][2]=0;

// WINAPIだと終端を0にしてくれないので

// mac2[i][0]=MAC[i*3];

// mac2[i][1]=MAC[i*3+1];

// mac2[i][2]=0;

//と同じ

}

3.おまけMACアドレスをINT型配列に格納

for(i=0;i<6;i++){

//1文字目(3字ごとにあるので0,3,6,9,12,15文字目が該当)

j=(MAC[i*3]|’ ’)-’0’;

//2文字目(3字ごとにあるので1,4,7,10,13,16文字目が該当)

// |’ ’してるのは大文字があった場合小文字に変換するため

k=(MAC[i*3+1]|’ ’)-’0’;

//abcdefだった場合 10,11,12,13,14,15に変換する

if(j>10)j-=0x27;

if(k>10)k-=0x27;

//1文字目を16倍して2文字目の数値と足し算

mac[i]=(j<<4)+k;

}

こんな感じです

id:neige_larme

1番目の回答はatoiですね。shortなのでintでもいいのか自信がなかったのですが。

2番目は思ったより難しいのですね。勉強になりました。char mac2[6][3]となってますが、char mac2[6]の場合、格納することは可能でしょうか?

ありがとうございます。助かりました!

2004/12/17 12:26:07
id:mogos No.4

mogos回答回数33ベストアンサー獲得回数02004/12/17 12:22:38

ポイント50pt

http://www.paw.hi-ho.ne.jp/takadayouhei/technic/47.html

atoi 〜文字列を整数に変換する〜

1の方法はここに書いてあるようにatoiを使ってint型にしたものをshortにキャストすればできます。

char *a;/* 数字の文字列 */

short i = (short)atoi(a);

というかんじ。

http://www.geocities.jp/ky_webid/c/044.html

C言語編 第44章 型変換関数

2の質問についてはMAC文字列のような固定したフォーマットならsscanfが一番楽かと思います。

char *a = ”AA:BB:CC:DD:EE:FF”;

char mac[6];

sscanf(a, ”%s:%s:%s:%s:%s:%s”,&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);

id:neige_larme

1番目:やはりatoiでよさそうですね。自信がもてました。ありがとうございます。

2番目:ちょっと目から鱗でした。勉強になりました。ありがとうございます!

2004/12/17 12:30:57
  • id:EddyYamanaka
    sscanf()の例

    バグってますよぉ!!
    気をつけて!!
  • id:neige_larme
    えっ

    そ、そうなんですか!!(>_<)
    何が合っていて何が間違っているのかわからないので、
    こちらに書いて頂ければ幸いです
  • id:mogos
    (投稿者削除)

  • id:mogos
    Re:えっ

    ほんとだ間違ってる。ごめんなさい。
    C触ってないからこういうことになる。
    #include ”stdlib.h”
    #include ”stdio.h”
    int main(){
    char *a = ”AA:BB:CC:DD:EE:FF”;
    char mac[6][3];
    sscanf(a, ”%2s:%2s:%2s:%2s:%2s:%2s”,&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
    for(int i = 0;i < 6;i++){
    printf(”%s”, mac[i]);
    }
    }
    こんな感じでお願いします。
  • id:EddyYamanaka
    (投稿者削除)

  • id:EddyYamanaka
    質問者の思いは…

    ◆scanf()をそのまま実行すると…
    『%s』は文字列格納ですので、”AA”は文字列のまま’A’,’A’,’¥0’の3キャラクタがmac[0],mac[1],mac[2]に格納されます。
    その次は”BB”が’B’,’B’,’¥0’でmac[1]から、…
    なので、結果は”ABCDEFF”にしかなりません。
    mac[0]=’A’
    mac[1]=’B’
    mac[2]=’C’
    mac[3]=’D’
    mac[4]=’E’
    mac[5]=’F’
    mac[6]=’F’
    mac[7]=’¥0’
    ==============================
    質問者が求めているのは恐らく、「16進数2桁の文字列を1バイトに」していく事だと思います。
    なら…
    sscanf(a, ”%x:%x:%x:%x:%x:%x”,&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
    になります。
    但し、”%x”では通常 int 型として結果を格納するので、一度 int の配列に格納してから char の配列に代入するのが正しいと思います。
    (できれば char ではなく unsigned char にしましょう)

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません