teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

#if 1 に修正

2019/12/29 16:05

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -106,7 +106,7 @@
106
106
  念の為:エラー時、inet_ntop() が返した "80.80.160.160" は、in_addr.s_addr の初期値 0xa0a05050 が変換されたものです。
107
107
 
108
108
  この動作確認プログラムは
109
- - "if 1""if 0" にすれば inet_addr() を使う
109
+ - #if 1 を #if 0 に変更すれば inet_addr() を使う
110
110
  - char dst[16]; を、たとえば char dst[14]; に変更すれば inet_ntop() がエラーを返すことを確認できる
111
111
 
112
112
  さらに、自作の関数をこのテストプログラムから呼べば・・・

1

改行、段落など微修正

2019/12/29 16:05

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -11,17 +11,14 @@
11
11
  > return( dst );
12
12
  > で、dstにNULLをいれて返しているはずなのですが、うまくいきません
13
13
 
14
- 'N' なら、'N' == 0x4E == 78 という整数値、即ち** 'N' は N という文字のアスキーコード値**です。
14
+ たとえば 'N' == 0x4E == 78 という整数値、即ち** 'N' は N という文字のアスキーコード値**です。
15
- では 'NULL' は何か?普通こういう書き方はしないので ``` return 'NULL'; ``` を試してみると
16
- 'NULL' == 0x4e554c4c == 1314212940 であることを確認できました。
17
- 'N' == 0x4e, 'U' == 0x55, 'L' == 0x4c なので説明は不要でしょう。
15
+ では 'NULL' は何か?普通こういう書き方はしないので ``` return 'NULL'; ``` を試してみると 'NULL' == 0x4e554c4c == 1314212940 であることを確認できました。'N' == 0x4e, 'U' == 0x55, 'L' == 0x4c なので説明は不要でしょう。
18
16
  return 'NULL'; は return 0x4e554c4c; であり、ともかく return 0; ではありません。
19
17
 
20
- なお、'\0' の値も0ですから、return '\0'; と return 0; は結果は同じですが、**'\0' と NULL では表す意味・使うべき場面が違います**。この場合 return '\0'; は誤った使い方なので、バグです。
18
+ なお、'\0' の値も0ですから、return '\0'; と return 0; は結果は同じですが、**'\0' と NULL では表す意味・使うべき場面が違います**。この場合 return '\0'; は誤った使い方なので、バグです。
21
19
 
22
20
  さて、そもそも質問者には勘違いがあるようです。
23
- > inet_ntopの仕様だと、アドレス表記がおかしいというエラーが起きた際は、
21
+ > inet_ntopの仕様だと、アドレス表記がおかしいというエラーが起きた際は、NULLを返すようにしなければならない
24
- NULLを返すようにしなければならない
25
22
 
26
23
  それは inet_ntop() ではなく、inet_pton() の仕様・役割だ、ということ。
27
24
 
@@ -116,15 +113,11 @@
116
113
 
117
114
  > if (p[1] == 01) ←この判定はヘン。違和感ありまくり
118
115
 
119
- - この「01」は, "130.01.7.23" の「01」と比較しようとしたのだと思う。
116
+ - この「01」は, "130.01.7.23" の「01」と比較しようとしたのだと思う。しかし、 01 は(8進数表記であるが)要するに1という値である。つまり、``` if (p[1] == 1) ``` です。
120
- しかし、 01 は(8進数表記であるが)要するに1という値である。
121
- つまり、``` if (p[1] == 1) ``` です。
122
117
 
123
- - 重大なのは、この時点の p[1] は数字文字列 "01" ではない事。
124
- p[1] は数字文字列 "01" を変換した数値なので、意図と違う判定をしている。
118
+ - 重大なのは、この時点の p[1] は数字文字列 "01" ではない事。p[1] は数字文字列 "01" を変換した数値なので、意図と違う判定をしている。
125
119
 
126
- - 対策すべき表記は "130.02.7.23", "130.1.07.23", "130.2.7.00",
120
+ - 対策すべき表記は "130.02.7.23", "130.1.07.23", "130.2.7.00", "310.1.7.23", "A30.0.7.23" 等々、様々なパターンが考えられるが、これらが全く考慮されていない。
127
- "310.1.7.23", "A30.0.7.23" 等々、様々なパターンが考えられるが、これらが全く考慮されていない。
128
121
 
129
122
  ただし、自作の inet_pton() で全てのパターンに完璧に対応しようとしてはいけません。今の質問者の力量で無茶すると、最悪、動くプログラムを何も作れなくなります。
130
123
  むしろ、**最初はエラー対策を一切考慮しないプログラムを作る**。正常なアドレス表記を処理できることを確認した後、できることから**少しづつ対応するように修正する**ことをお勧めしたい。たとえば