代码可以通过寻找ddd.ddd.ddd.ddd模式的文件行进。
避免使用"%d"
或"%u"
,因为它们接受领先空格,并且'-'
和'+'
。
伪代码
Read from a file until EOF found
repeatedly look for a digit
if it is found
note position
put digit back into stream
look for ddd.ddd.ddd.ddd
if found
decode (and test for values > 255)
if successful return result
go back to position
return fail value;
示例代码。还应该有IO错误检查。
unsigned long Parse_IP(FILE *inf) {
int ch;
for ((ch = fgetc(inf)) != EOF) {
if (isdigit(ch)) {
long pos = ftell(inf);
ungetc(ch, inf);
char buf[4][4];
int count = fscanf(inf, "%3[0-9].%3[0-9].%3[0-9].%3[0-9]",
buf[0], buf[1], buf[2], buf[3]);
if (count == 4) {
unsigned long ip = 0;
int i;
for (i=0; i<4; i++) {
int digit = atoi(buf[i]);
if (digit > 255) break;
ip = ip*256 + digit;
}
if (i == 4) return ip;
}
fseek(inf, pos, SEEK_SET);
}
}
return 0;
}
使用范例
unsigned long ip;
while ((ip = Parse_IP(inf)) != 0) {
printf("ip %08lX\n", ip);
}
这取决于如果文件格式是固定和OU知道在哪里查找IP地址,或者如果您需要扫描模式,*外观*如IP地址线。这将是近似值,因为URL可能包含产生误报的模式。 – chqrlie
如果IP地址始终在开头,那么在检查正确的格式后,用'sscanf'解析它们是相对容易的。 – chqrlie
“例如** 1 ** **行是:** ** ** **行数据? – chux