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

質問編集履歴

3

ソースコードの変更

2019/11/21 08:54

投稿

ht3433
ht3433

スコア19

title CHANGED
File without changes
body CHANGED
@@ -57,4 +57,20 @@
57
57
 
58
58
  return( 1 );
59
59
  }
60
+
61
+ int main(){
62
+ int result;
63
+ struct in_addr in_addr;
64
+
65
+ result = inet_pton("130.0.7.23", &in_addr);
66
+ assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130));
67
+
68
+ result = inet_pton("130.00.7.23", &in_addr);
69
+ assert(result == 0);
70
+
71
+ result = inet_pton("130.01.7.23", &in_addr);
72
+ assert(result == 0);
73
+
74
+ return(0);
75
+ }
60
76
  ```

2

タイトルの変更

2019/11/21 08:54

投稿

ht3433
ht3433

スコア19

title CHANGED
@@ -1,1 +1,1 @@
1
- Linuxコマンドのinet_pton作りたいです。
1
+ void型uint32_t型にキャストしたい
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
- Linuxコマンドのinet_ptonを作りたいです。
3
- ネットで調べながらコーディングしてみたのですが、void型をuint32_tにキャストしたいのですがエラーになってしまい、どう対処すればよいか困っています。
2
+ ネットで調べながらコーディングしてみたのですが、void型をuint32_tにキャストしたいのですがエラーになってしまい、どう対処すればよいか困っています。
3
+ 最終的にはLinuxコマンドのinet_ptonを作るつもりです。
4
4
  お力添えいただければ幸いです。
5
5
  宜しくお願い致します。
6
6
 

1

ソースコードの変更

2019/11/21 06:11

投稿

ht3433
ht3433

スコア19

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
  Linuxコマンドのinet_ptonを作りたいです。
3
- ネットで調べながらコーディングしてみたのですが、エラーになってしまい、どう対処すればよいか困っています。
3
+ ネットで調べながらコーディングしてみたのですが、void型をuint32_tにキャストしたいのですがエラーになってしまい、どう対処すればよいか困っています。
4
4
  お力添えいただければ幸いです。
5
5
  宜しくお願い致します。
6
6
 
@@ -8,12 +8,11 @@
8
8
  ### 発生している問題・エラーメッセージ
9
9
 
10
10
  ```
11
- エラー: ‘uint32_t {aka unsigned int}’ から ‘const char*’ への無効な変換です [-fpermissive]
11
+ エラー: ‘uint32_t {aka unsigned int}’ から ‘const void*’ へ の無効な変換です [-fpermissive]
12
- src = net_No;
13
- エラー: expected unqualified-id before ‘=’ token
14
- in_addr = src;
15
- エラー: expected primary-expression before ‘)’ token
16
- strcpy( dst, in_addr );
12
+ memcpy( dst, No.number1, 4);
13
+
14
+ エラー: initializing argument 2 of ‘void* memcpy(void*, const void*, size_t)’ [-fpermissive]
15
+ extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
17
16
  ```
18
17
 
19
18
  ### 該当のソースコード
@@ -25,45 +24,37 @@
25
24
  #include <stdlib.h>
26
25
  #include <string.h>
27
26
 
27
+
28
- int inet_pton(const char *src,void *dst )
28
+ int inet_pton(const char *src, void *dst ){
29
+
29
- {
30
+ // 変数の宣言
31
+ int suuti1,suuti2,suuti3,suuti4;
32
+
33
+ // 共用体の型の定義
30
34
  union number{
31
35
  uint32_t number1;
32
36
  uint8_t number2[4];
33
37
  };
34
- union number No;
35
- uint32_t net_No;
36
- No.number2[0] = 130;
37
- No.number2[1] = 0;
38
- No.number2[2] = 7;
39
- No.number2[3] = 23;
40
38
 
39
+ // 共用体の変数名の宣言
41
- net_No = htonl( No.number1 );
40
+ union number No;
42
41
 
43
- // srcをIPv4ネットワークアドレス構造体に変換
42
+ // srcの文字列を数値に変換する
44
- src = net_No;
43
+ sscanf( src, "%d.%d.%d.%d", &suuti1, &suuti2, &suuti3, &suuti4 );
45
44
 
45
+ // 数値に変換したものを変数に格納する
46
- in_addr = src;
46
+ No.number2[0] = suuti1;
47
+ No.number2[1] = suuti2;
48
+ No.number2[2] = suuti3;
49
+ No.number2[3] = suuti4;
47
50
 
48
- // dstにコピーする
51
+ // void型のdstをuint32_t型キャストする
49
- strcpy( dst, in_addr );
52
+ No.number1 = ( uintptr_t )&dst;
50
53
 
54
+ // number1の4バイト分のメモリをdstにコピーする
51
- return( 0 );
55
+ memcpy( dst, No.number1, 4);
52
- }
53
56
 
54
- int main(){
55
- int result;
56
- struct in_addr in_addr;
57
57
 
58
- result = inet_pton("130.0.7.23", &in_addr);
59
- assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130));
60
-
61
- result = inet_pton("130.00.7.23", &in_addr);
62
- assert(result == 0);
63
-
64
- result = inet_pton("130.01.7.23", &in_addr);
65
- assert(result == 0);
66
-
67
- return(0);
58
+ return( 1 );
68
59
  }
69
60
  ```