fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6.  
  7. int main(void) {
  8.  
  9. char *ipArray[3];
  10. char *ptr;
  11. char str[100];
  12. int i,j,k,a,b,c,count,len;
  13. int num[3];
  14. /*入力*/
  15. printf("ご希望のipアドレスを入力してください\n");
  16. scanf("%s",&str);
  17. printf("ipアドレスは%sと入力されました\n",str);
  18.  
  19.  
  20.  
  21. /*----------使用文字の判定----------*/
  22.  
  23. for(b = 0; b < strlen(str); b++){
  24. if(str[b] != '1'){
  25. if(str[b] != '2'){
  26. if(str[b] != '3'){
  27. if(str[b] != '4'){
  28. if(str[b] != '5'){
  29. if(str[b] != '6'){
  30. if(str[b] != '7'){
  31. if(str[b] != '8'){
  32. if(str[b] != '9'){
  33. if(str[b] != '0'){
  34. if(str[b] != '.'){
  35. printf("使用不可文字が使用されています。0~9 と . のみを使用してください");
  36. exit(1);
  37. } } } } } } } } } } }
  38. else{
  39. continue;
  40. }
  41. }
  42. printf("使われている数値と文字は正常です\n");
  43.  
  44.  
  45. /*----------.の数の確認----------*/
  46.  
  47. count = 0;
  48. //ptr = srcpy(str);
  49. for(c = 0; c < strlen(str); c++){
  50. if(str[c] == '.'){
  51. count++;
  52. }
  53. }
  54.  
  55. if(count == 3){
  56. printf(".の数は正常です\n");
  57. }else if(count > 3){
  58. printf(".の数が指定の数(3つ)より多いです");
  59. exit(1);
  60. }else{
  61. printf(".の数が指定の数(3つ)より少ないです");
  62. exit(1);
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69. /* . と数字以外が入力されていないかの判定*/
  70.  
  71. /*----------ipArray[0]がNULLかの判定----------*/
  72.  
  73. if(str[0] == '.'){
  74. printf("Error:第1octetがNULLです");
  75. exit(1);
  76. }
  77.  
  78. /*----------カンマを区切りに文字列を分割----------*/
  79. /*1回目*/
  80. ptr = strtok(str, ".");
  81. ipArray[0] = ptr;
  82.  
  83. /*配列に格納されているか確認するためのprintf文*/
  84. printf("第1octet : %s\n", ipArray[0]);
  85.  
  86. /*2回目以降*/
  87. i = 1;
  88. while(ptr != NULL) {
  89. /*strtok関数により変更されたNULLのポインタが先頭*/
  90. ptr = strtok(NULL, ".");
  91. ipArray[i] = ptr;
  92. /*----------ipArray[i]がNULLかの判定----------*/
  93. if(ptr == NULL){
  94. printf("Error:第%doctetがNULLです\n",i);
  95. exit(1);
  96. }
  97. else/*(ptr != NULL) */{
  98. printf("第%doctet : %s\n",i+1, ipArray[i]);
  99. }
  100. i++;
  101. if ( i > 3 ) break;
  102. }
  103. /*----------文字数検査----------*/
  104. /******エラー時は動く*****/
  105.  
  106. for(j=0; j < 4; j++){
  107. if(strlen(ipArray[j]) < 4){
  108. printf("第%doctetは正常です\n", j+1);
  109. continue;
  110. }else{
  111. //0002は 0 < 0002 < 255なのでそれに対応するため
  112. printf("Error:octetは1~3桁にしてください\n");
  113. exit(1);
  114. }
  115. }
  116.  
  117. /*これ以降はnum[]を使用*/
  118. /*----------文字列から数値にキャスト----------*/
  119.  
  120. num[0] = atoi(ipArray[0]);
  121. num[1] = atoi(ipArray[1]);
  122. num[2] = atoi(ipArray[2]);
  123. num[3] = atoi(ipArray[3]);
  124. for(k=0; k < 4; k++){
  125.  
  126. /***下のコメント文を入れるとError時のみ動く***/
  127. /*0~255の範囲内か*/
  128. if(num[k] < 0 || num[k] > 255){
  129. printf("Error:0~255までの数字を入力してください");
  130. exit(1);
  131. }else{
  132. printf("%d\n", num[k]);
  133. }
  134. }
  135.  
  136. /*----------プライベートアドレスの使用----------*/
  137.  
  138. if(num[0] == 10){
  139. printf("Error:プライベートアドレスが使用されています");
  140. exit(1);
  141. }
  142.  
  143. else if(num[0] == 172 && num[1] >= 16 && num[1] <= 31){
  144. printf("Error:プライベートアドレスが使用されています");
  145. exit(1);
  146. }
  147.  
  148. else if(num[0] == 192 && num[1] == 168){
  149. printf("Error:プライベートアドレスが使用されています");
  150. exit(1);
  151. }
  152.  
  153. /*----------クラスDアドレスの使用----------*/
  154.  
  155. else if(num[0] >= 224 && num[0] <= 239){
  156. printf("Error:クラスDアドレスが使用されています");
  157. exit(1);
  158. }
  159.  
  160. /*----------リンクローカルアドレスの使用----------*/
  161.  
  162. else if(num[0] == 169 && num[1] == 254){
  163. printf("Error:リンクローカルアドレスが使用されています");
  164. exit(1);
  165. }
  166.  
  167.  
  168.  
  169.  
  170. else{
  171. printf("ipアドレスは正常です");
  172. }
  173.  
  174. return 0;
  175. }
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188. /*正常時の0~255判定
  189. NULL判定 1から3
  190.   validate_IP_adder()の作成 resultの値に応じてメッセージを表示*/
  191.  
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桁にしてください