質問編集履歴

5

誤字

2019/12/26 07:30

投稿

ht3433
ht3433

スコア19

test CHANGED
@@ -1 +1 @@
1
- ネットワークアドレス構造体を文字列に変換したいですso-
1
+ ネットワークアドレス構造体を文字列に変換したいです
test CHANGED
File without changes

4

ソースコードの修正

2019/12/26 07:30

投稿

ht3433
ht3433

スコア19

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
 
74
74
 
75
- result = inet_pton( 1300723 );
75
+ result = inet_ntop( 1300723 );
76
76
 
77
77
  assert( result == 0 );
78
78
 

3

ソースコードの修正

2019/12/25 08:53

投稿

ht3433
ht3433

スコア19

test CHANGED
@@ -1 +1 @@
1
- ネットワークアドレス構造体を文字列に変換したいです
1
+ ネットワークアドレス構造体を文字列に変換したいですso-
test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- int inet_pton( int src ) {
39
+ int inet_ntop( int src ) {
40
40
 
41
41
 
42
42
 

2

文章修正、ソースコードの作成

2019/12/25 08:53

投稿

ht3433
ht3433

スコア19

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,12 @@
1
1
  ネットワークアドレス構造体を文字列に変換したいです。
2
2
 
3
- そして、その変換ができるinet_ntopを自作してみたのですが、まったやり方が思せん
3
+ そして、その変換ができるinet_ntopを自作してみたのですが、2点ほどうまくいかないところがあり
4
4
 
5
+ 1つ目は、文字列に変換する際、8ビット毎に数値を文字列に変換し、そのたびに「.」を付け加えたいのですが、やり方が思い浮かびません。
6
+
5
- ため何かアドバイスをいただきたいです。
7
+ 2つ目は、テストパターンです。簡単にではあるですがトパターン一つ作ってす。
8
+
9
+ ですが、本当は、inet_ntop(const void *src,char *dst, socklen_t cnt)のように引数3つでのテストパターンを作成したいのですが、うまく作成できません。
6
10
 
7
11
 
8
12
 
@@ -14,8 +18,68 @@
14
18
 
15
19
 
16
20
 
17
- 丸投げの質問ということは重々承知です。
18
-
19
- ですが、6時間考えても分からなかったので、ご教授していただきたいです。
21
+ 6時間考えても分からなかったので、ご教授していただきたいです。
20
22
 
21
23
  宜しくお願い致します。
24
+
25
+
26
+
27
+ ```C言語
28
+
29
+ #include <stdio.h>
30
+
31
+ #include <stdlib.h>
32
+
33
+ #include <assert.h>
34
+
35
+ #define N 256
36
+
37
+
38
+
39
+ int inet_pton( int src ) {
40
+
41
+
42
+
43
+ // 変数の宣言
44
+
45
+ char s1[N] = {'\0'};
46
+
47
+
48
+
49
+ // 数値を文字列に変換
50
+
51
+ sprintf( s1, "%d", src );
52
+
53
+
54
+
55
+ // 変換したものを出力
56
+
57
+ fprintf( stdout, "%s\n", s1 );
58
+
59
+
60
+
61
+ return( 0 );
62
+
63
+ }
64
+
65
+
66
+
67
+ int main(){
68
+
69
+
70
+
71
+ int result;
72
+
73
+
74
+
75
+ result = inet_pton( 1300723 );
76
+
77
+ assert( result == 0 );
78
+
79
+
80
+
81
+ return( 0 );
82
+
83
+ }
84
+
85
+ ```

1

文章の修正

2019/12/25 08:17

投稿

ht3433
ht3433

スコア19

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  そして、その変換ができるinet_ntopを自作してみたいのですが、まったくやり方が思い浮かびません。
4
4
 
5
- inet_ntop逆の処理であるinet_ptonなら下記のソーコードがそうですが、自作できたですが、これを参考にしてもできませんでした
5
+ ため何かアドバイをいただきたです。
6
+
7
+
6
8
 
7
9
  下記は、inet_ntopのmanページです。
8
10
 
@@ -14,130 +16,6 @@
14
16
 
15
17
  丸投げの質問ということは重々承知です。
16
18
 
17
- ですが、3時間考えても分からなかったので、ご教授していただきたいです。
19
+ ですが、6時間考えても分からなかったので、ご教授していただきたいです。
18
20
 
19
21
  宜しくお願い致します。
20
-
21
-
22
-
23
- ```C言語
24
-
25
- #include <stdio.h>
26
-
27
- #include <assert.h>
28
-
29
- #include <string.h>
30
-
31
- #include <arpa/inet.h>
32
-
33
- int inet_pton( const char *src, void *dst ){
34
-
35
-
36
-
37
- // 変数の宣言
38
-
39
- int suuti1, suuti2, suuti3, suuti4;
40
-
41
- char buf[32];
42
-
43
-
44
-
45
- // 共用体の型の定義
46
-
47
- union number{
48
-
49
- uint32_t number1;
50
-
51
- uint8_t number2[4];
52
-
53
- };
54
-
55
-
56
-
57
- // 共用体変数の宣言
58
-
59
- union number No;
60
-
61
-
62
-
63
- // srcの文字列を数値に変換し、その数値が4つあるか判定
64
-
65
- if ( sscanf( src, "%u.%u.%u.%u", &suuti1, &suuti2, &suuti3, &suuti4 ) != 4 )
66
-
67
- {
68
-
69
- return( 0 );
70
-
71
- }
72
-
73
-
74
-
75
- // srcの文字列をbufの文字配列に格納
76
-
77
- // 格納する際、値の範囲チェックのためuint8_tにキャスト
78
-
79
- sprintf( buf, "%u.%u.%u.%u", ( uint8_t )suuti1, ( uint8_t )suuti2, ( uint8_t
80
-
81
- )suuti3, ( uint8_t )suuti4 );
82
-
83
-
84
-
85
- // srcとbufの文字列が異なるか判定
86
-
87
- if ( strcmp( src, buf ) ){
88
-
89
- return( 0 );
90
-
91
- }
92
-
93
-
94
-
95
- // srcの数値が格納されている変数を共用体の型のunit8_tの変数に代入
96
-
97
- No.number2[0] = suuti1;
98
-
99
- No.number2[1] = suuti2;
100
-
101
- No.number2[2] = suuti3;
102
-
103
- No.number2[3] = suuti4;
104
-
105
-
106
-
107
- // unit32_tのメモリをdstにコピー
108
-
109
- memcpy( dst, &No.number1, 4 );
110
-
111
- return( 1 );
112
-
113
- }
114
-
115
-
116
-
117
- int main(){
118
-
119
- int result;
120
-
121
- struct in_addr in_addr;
122
-
123
-
124
-
125
- result = inet_pton( "130.0.7.23", &in_addr );
126
-
127
- assert( result == 1 && in_addr.s_addr == ( ( 23 << 24 )|( 7 << 16 )|( 0 << 8 )|130 ) );
128
-
129
-
130
-
131
- result = inet_pton( "130.00.7.23", &in_addr );
132
-
133
- assert( result == 0 );
134
-
135
-
136
-
137
- return(0);
138
-
139
- }
140
-
141
-
142
-
143
- ```