1. C++ / Говнокод #24094

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <string.h>
    #include <stdlib.h>
    
    typedef std::ios_base& sibr;
    typedef sibr (*StringType)(sibr);
    
    int atoi_hod(const char a[], short int *offset) 
    {
    	short int numtype = (a[0]== '0')+((a[1]=='x')||(a[1]=='X'));
        StringType st;
        *offset = 0;
        while(a[*offset]&&a[*offset]!='.') (*offset)=(*offset)+1;
        switch (numtype)
        {
    		case 0:
    		  st = std::dec;
    		break;
    		case 1:
    		  st = std::oct;
    		break;
    		case 2:
    		  st = std::hex;
    		break;		
    	}
        int u;
        std::istringstream(a)>>st>>u;    
    	return u;
    }
    
    bool isIpv4String(const std::string &str)
    {
    	size_t size = str.length();
    	bool result = size!=0;
    	if(result)
    	{
    		const char *c_str = str.c_str();
    		unsigned long int i = 0;
    		char sym;
    		do
    		{
    			sym = c_str[i++];
    			result = sym=='.'||(sym>='0'&&sym<='9')||!sym||(sym>='a'&&sym<='f')||(sym>='A'&&sym<='F')||sym=='x'||sym=='X';
    				
    		}
    		while (sym&&result);
    		i = 0;
    		short int dotsOrTerm = 0, numbers = 0, offset; 
    		while (result&&i<size) 
    		{
    			int n = atoi_hod(&c_str[i], &offset);
    			result = n<256;
    			numbers += result; 
    			i += offset;
    			result = result&&(c_str[i]=='.'||!c_str[i]);
    			i+=result;
    			dotsOrTerm += result; 			
    		}
    		result = (dotsOrTerm == 4)&&(numbers == 4);		
    	}
    	return result;
    }
    
    int main() 
    {
    	std::string adress;
    	std::cin>>adress;
    	std::cout<<(isIpv4String(adress)?"TRUE":"FALSE")<<std::endl;
    	return 0;
    }

    По мотивам ГК #24055, наконец-то руки дошли.

    Запостил: Psionic, 09 Апреля 2018

    Комментарии (3) RSS

    • Хм.

      Xx7F.0.0.9х01
      Ответить
      • Xx7F.0.0.9х01 - не валидная запись, даже браузерный движок спотыкается.
        Ответить
        • Ах ну да, там же восьмеричное получается.
          Хотел сказать
          Xx177.0.0.9х01
          Это, кажется, по данной программе должно быть валидным.
          Ответить

    Добавить комментарий