代碼可以通過尋找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