前提・実現したいこと
数値の先頭が0か判定したいです。
ソースコードのassertの内容をみればわかるとは思いますが、アドレスの途中が「01」となっており、アドレスの表記の仕方が間違っているので、これをエラーにしたいのですが、
if( strstr( src, "01." ) ){
return( 0 );
のようなソースコードしか思い浮かばず、詰まっています。
また、作成したソースコードはinet_ptonのような動きをします。
お力添えいただければ幸いです。
よろしくお願い致します。
該当のソースコード
C言語
1#include <assert.h> 2#include <arpa/inet.h> 3#include <stdio.h> 4#include <string.h> 5 6int inet_pton( const char *src, void *dst ){ 7 8 // 変数の宣言 9 int suuti1, suuti2, suuti3, suuti4; 10 11 // 共用体の型の定義 12 union number{ 13 uint32_t number1; 14 uint8_t number2[4]; 15 }; 16 17 // 共用体の変数名の宣言 18 union number No; 19 20 // srcの文字列を数値に変換し、それが4つあるか判定 21 if ( sscanf( src, "%d.%d.%d.%d", &suuti1, &suuti2, &suuti3, &suuti4 ) != 4 ){ 22 return( 0 ); 23 } 24 25 // 数値に変換したものを変数に格納する 26 No.number2[0] = suuti1; 27 No.number2[1] = suuti2; 28 No.number2[2] = suuti3; 29 No.number2[3] = suuti4; 30 31 // number1のメモリをdstにコピーする 32 memcpy( dst, &No.number1, 4 ); 33 return( 1 ); 34} 35 36int main(){ 37 int result; 38 struct in_addr in_addr; 39 40 result = inet_pton("130.0.7.23", &in_addr); 41 assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130)); 42 43 result = inet_pton("130.01.7.23", &in_addr); 44 assert(result == 0); 45 46 return(0); 47}
> アドレスの途中が「01」となっており、アドレスの表記の仕方が間違っている
なぜ "01" が間違いなのか教えて頂けますか.
ゼロ始まりだからなのか, 8進数になってしまうからなのか, (ipアドレスとして) 130.0.7.23 でなければならないのに 130.1.7.23 だからなのか….
そもそも論ですが、
#include <arpa/inet.h>
してらっしゃるのですが、そのヘッダーにinet_ptonは定義されているのですから同名の関数は定義できませんよ。
includeをやめるか名前を変えましょう。
おそらく、質問者は C と C++ の区別がつかず、ソースファイルの拡張子を .cpp にしてしまって C++ としてコンパイルされているのではないでしょうか? C++ では引数の異なる同名の関数を定義できます。なお、ヘッダにあるのは、定義ではなく、宣言です。
> アドレスの途中が「01」となっており、アドレスの表記の仕方が間違っているので
すでに他の方からも指摘がありますが、「**.01.**.**」のような書き方でも、IPv4アドレスとしては「正当」とされます。それでもチェックしたいのでしょうか。
回答5件
あなたの回答
tips
プレビュー