그래서 저는 이 codewars kata를하고 있고 모든 테스트에서 성공하고 있지만 결국에는 제 코드에 세그멘테이션 결함이 있고 그것을 찾을 수있는 언어에 대해 충분히 알지 못하기 때문에 결과가 실패합니다! 누군가 제발 멈출 수 있습니까?
int is_valid_ip(const char *addr)
{
char set[] = "1234567890";
int current;
int octet_counter = 0;
char *octet = 0;
octet = strtok(addr, ".");
while (octet)
{
if (strspn(octet, set) != strlen(octet)) return 0; // checks for spaces
if (strlen(octet) > 1 && (octet[0]) == '0') return 0; // checks for preceding zeros
sscanf(octet, "%d", ¤t);
if (current < 0 || current > 255) return 0; // checks for range
octet = strtok(0, ".");
++octet_counter;
}
if (octet_counter == 4) return 1; // checks for number of octets
return 0;
};
내 코드는 좀 더 깨끗했지만이 문제를 해결하기 위해 너무 엉망이 된 후에는 이렇게되었습니다.
으로 strtok()
수정 문자열을 토큰 화하는과 addr
같이 정의된다 const char *
당신이 입력 문자열의 복사본을 만들 수 있습니다 (I는이 요구 사항입니다 가정) *addr
:
char ip[16]; // enought to hold nnn.nnn.nnn.nnn
if(strlen(addr)>15) return 0;
strcpy(ip, addr);
이후 ip
대신에 작동addr
또는 ... strtok
문자열을 수정하지 않고 사용 하고 구문 분석 / 스캔 하지 마십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다