Code:bool ContainsAlpha(const std::string& s)
{
return(std::string::npos != s.find_first_not_of("0123456789.:");
}
Printable View
Code:bool ContainsAlpha(const std::string& s)
{
return(std::string::npos != s.find_first_not_of("0123456789.:");
}
well,
there are functions in ctype.h called isxdigit() and ispunct() that would come to use here.,
outputCode:
//c language code, but you get the point right?
#include<ctype.h>
#include<stdio.h>
int check_ip(char *p)
{
while(*p != '\0')
{
if(isxdigit(*p)==0)
{
if(ispunct(*p)==0)
{
return 0;
}
}
p++;
}
return 1;
}
int main()
{
char ip[16]="127.0.0.1";
char name[16]="123google.com";
char ipport[22]="127.0.0.1:8080";
char ipv6[50]="2001:db8:85a3:0:0:8a2e:370:7334";
/*Check if the string "ip" is an ip address or not*/
if(check_ip(ip)==1)
{
printf("%s is ip",ip);
}
/*Check if the string "name" is an ip address or not*/
if(check_ip(name)==1)
{
printf("%s is ip",name);
}
/*Check if the string "ipport" is an ip address or not*/
if(check_ip(ipport)==1)
{
printf("%s is ip\n",ipport);
}
/*Check if the string "ipv6" is an ip address or not*/
if(check_ip(ipv6)==1)
{
printf("%s is ip\n",ipv6);
}
return 0;
}
me thinks that satisfies the OPs requirements....Code:$ gcc isdigit.c
$ ./a.out
127.0.0.1 is ip
127.0.0.1:8080 is ip
2001:db8:85a3:0:0:8a2e:370:7334 is ip
:)
I think you're starting on the right track, but you need to do a lot more checking to verify a valid IP address: the number of fields and the numeric value in each field.
Hints: keep track of the location of the lastDot and the currentDot, as well as the total dotCount. If you hit a colon ':' or a non-numeric before you reach 3 dots, return the failure condition. If you encounter a dot set the currentDot to the current position, then use the two to find the field width, then check the field width, then check for a substring that is an integer between 0 and 255 (or 0 and 65535 for the port number).
Also, keep in mind that the max size of a valid IPv4 address c-string is 22 characters (including the null-terminator) i.e. "255.255.255.255:65535"
There's probably a couple conditions I missed in there, but that's a general rundown.
Its also valid to append :port_number after a hostname, so that case would need to report hostname.
If I was trying to solve this I would probably do it like this.
Assuming you have a function like this...
std::vector<std::string> Split(const std::string &text, char delimiter)
Split the string at every ':'
For an IP address you should have either one or two elements.
Split the first element at every '.'
For an IP address you should have four elements.
Check that all elements in both vectors are integers between 0 and 255.
EDIT: Except for the port number of course.