アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cでネットワークプログラミングの勉強をしているのですが
IPアドレスをin_addr型で保存しています。
IPアドレス、具体的には「192.168.0.1」というのをchar型の配列で
ip[0]="192"
ip[1]="168"
ip[2]="0"
ip[3]="1"
と言う風に変えたいのですが何か関数を使って出来ないでしょうか。
in_addr型をchar型でキャストした場合は
ip[0]="1"
ip[1]="9"
ip[2]="2"
と言うような感じになってしまいました。
よろしくお願いします。

A 回答 (2件)

ip[0]="192"


という風に変えたいと書かれておりますが、ip[]というのはどう宣言されているのでしょうか。
char ip[32];
のように宣言されているのなら、それはあくまでも「charの配列」なので、ip[0]には一つのcharしか代入できず、
ip[0]="192"
という形で入れることはできません。大きさが4つの配列で実現するなら、
ip[0]=192
という形で文字列でなくunsigned char型の数値として代入するか、
char ip[4][4];
のように「文字列の配列」つまり「charの配列の配列」と宣言しないといけません。

文字列として'.'を抜いたそれぞれの値を取り出したいのなら、in_addr型の変数をinとすると、inet_ntoa()を使って、
char *ip[4];
char ip_str[16];
と宣言しておき、
strcpy(ip_str,inet_ntoa(in));
ip[0] = strtok(ip_str,".");
ip[1] = strtok(ip_str,NULL);
ip[2] = strtok(ip_str,NULL);
ip[3] = strtok(ip_str,NULL);
とすればいいのではないでしょうか。

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
    • good
    • 0
この回答へのお礼

ありがとうございます。
勉強になりました。

お礼日時:2006/11/28 02:24

char ip[4][4];


sprintf(ip[0], "%d", inaddr.S_un.S_un_b.s_b1);
sprintf(ip[1], "%d", inaddr.S_un.S_un_b.s_b2);
sprintf(ip[2], "%d", inaddr.S_un.S_un_b.s_b3);
sprintf(ip[3], "%d", inaddr.S_un.S_un_b.s_b4);

とか
    • good
    • 0
この回答へのお礼

参考になりました。
ありがとうございました。

お礼日時:2006/11/28 02:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!