fork download
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


int main(void) {

	char *ipArray[3];
	char *ptr;
  char str[100];
	int i,j,k,a,b,c,count,len;
  int num[3];
	/*入力*/
	printf("ご希望のipアドレスを入力してください\n");
	scanf("%s",&str);
	printf("ipアドレスは%sと入力されました\n",str);



/*----------使用文字の判定----------*/

for(b = 0; b < strlen(str); b++){
      if(str[b] != '1'){
        if(str[b] != '2'){
          if(str[b] != '3'){
            if(str[b] != '4'){
              if(str[b] != '5'){
                if(str[b] != '6'){
                  if(str[b] != '7'){
                    if(str[b] != '8'){
                      if(str[b] != '9'){
                        if(str[b] != '0'){
                          if(str[b] != '.'){
        printf("使用不可文字が使用されています。0~9 と . のみを使用してください");
        exit(1);
      } } } } } } } } } } }
      else{
          continue;
      }
  }
printf("使われている数値と文字は正常です\n");


/*----------.の数の確認----------*/

    count = 0;
    //ptr = srcpy(str);
    for(c = 0; c < strlen(str); c++){
      if(str[c] == '.'){
        count++;
      }
    }

    if(count == 3){
      printf(".の数は正常です\n");
    }else if(count > 3){
      printf(".の数が指定の数(3つ)より多いです");
      exit(1);
    }else{
      printf(".の数が指定の数(3つ)より少ないです");
      exit(1);
    }





/* . と数字以外が入力されていないかの判定*/

    /*----------ipArray[0]がNULLかの判定----------*/

  if(str[0] == '.'){
    printf("Error:第1octetがNULLです");
    exit(1);
  }

	/*----------カンマを区切りに文字列を分割----------*/
	/*1回目*/
	ptr = strtok(str, ".");
	ipArray[0] = ptr;

	/*配列に格納されているか確認するためのprintf文*/
	printf("第1octet : %s\n", ipArray[0]);

	/*2回目以降*/
	i = 1;
  		while(ptr != NULL) {
		/*strtok関数により変更されたNULLのポインタが先頭*/
			ptr = strtok(NULL, ".");
			ipArray[i] = ptr;
      /*----------ipArray[i]がNULLかの判定----------*/
      if(ptr == NULL){
        printf("Error:第%doctetがNULLです\n",i);
        exit(1);
      }
			else/*(ptr != NULL) */{
				printf("第%doctet : %s\n",i+1, ipArray[i]);
			}
			i++;
			if ( i > 3 ) break;
		}
	/*----------文字数検査----------*/
/******エラー時は動く*****/

	for(j=0; j < 4; j++){
		if(strlen(ipArray[j]) < 4){
			printf("第%doctetは正常です\n", j+1);
      continue;
		}else{
      //0002は 0 < 0002 < 255なのでそれに対応するため
			printf("Error:octetは1~3桁にしてください\n");
      exit(1);
		}
	}

  /*これ以降はnum[]を使用*/
  /*----------文字列から数値にキャスト----------*/

	    num[0] = atoi(ipArray[0]);
      num[1] = atoi(ipArray[1]);
      num[2] = atoi(ipArray[2]);
      num[3] = atoi(ipArray[3]);
for(k=0; k < 4; k++){

/***下のコメント文を入れるとError時のみ動く***/
        /*0~255の範囲内か*/
      if(num[k] < 0 || num[k] > 255){
        printf("Error:0~255までの数字を入力してください");
        exit(1);
      }else{
        printf("%d\n", num[k]);
      }
	}

  /*----------プライベートアドレスの使用----------*/

  if(num[0] == 10){
    printf("Error:プライベートアドレスが使用されています");
    exit(1);
  }

  else if(num[0] == 172 && num[1] >= 16 && num[1] <= 31){
    printf("Error:プライベートアドレスが使用されています");
    exit(1);
  }

  else if(num[0] == 192 && num[1] == 168){
    printf("Error:プライベートアドレスが使用されています");
    exit(1);
  }

  /*----------クラスDアドレスの使用----------*/

  else if(num[0] >= 224 && num[0] <= 239){
    printf("Error:クラスDアドレスが使用されています");
    exit(1);
  }

  /*----------リンクローカルアドレスの使用----------*/

  else if(num[0] == 169 && num[1] == 254){
    printf("Error:リンクローカルアドレスが使用されています");
    exit(1);
  }




  else{
    printf("ipアドレスは正常です");
  }

	return 0;
}












/*正常時の0~255判定
NULL判定 1から3
  validate_IP_adder()の作成 resultの値に応じてメッセージを表示*/
Runtime error #stdin #stdout 0s 9424KB
stdin
2.232.2.6333
stdout
ご希望のipアドレスを入力してください
ipアドレスは2.232.2.6333と入力されました
使われている数値と文字は正常です
.の数は正常です
第1octet : 2
第2octet : 232
第3octet : 2
第4octet : 6333
第1octetは正常です
第2octetは正常です
第3octetは正常です
Error:octetは1~3桁にしてください