我在ip地址上应用了一个公式。但它有时会给我一些随机输出,这是经过的。有时它没有正确地标记,有时它给出0值。 1000个样本中误差再生率几乎为2-5 调用函数=公式(IPADDRESS); 我每秒呼叫数百种不同的IP。
int formula ( char ip[]){
char *token = NULL;
unsigned long value;
int finalv;
char ipaddress[16];
char delims[]=".";
int octet=3;
value = 0;
FILE *fp;
fp = fopen(LOGFILE, "a");
strcpy(ipaddress,ip);
fprintf(fp, "%s\n",ipaddress);
token = strtok( ipaddress,delims);
while( token != NULL ) {
fprintf(fp,"%d",(atoi(token));
if ( atoi(token) != 0 ){
if(octet ==3)
value = value + (255 * 255 * 255 * (atoi(token)));
else if(octet ==2)
value = value + (255 * 255 * (atoi(token)));
else if(octet ==1)
value = value + (255 * (atoi(token)));
else if(octet ==0)
value = value + (atoi(token));
}
octet--;
token = strtok( NULL,delims);
}
finalv = value % 9999;
fprintf(fp, " -- %d \n",(int)finalv);
if(fp)
fclose(fp);
return (int)v;
}
OUTPUTFILE: (我只给出了错误的输出)
172.17.82.255
172 0 1 -- 1983
--
172.254.254.254
172 0 0 0 -- 1728
--
172.255.255.225
172 0 -- 1728
--
172.255.255.255
172 21 0 1 -- 7390
--
172.255.84.255
172 0 8 -- 3768
答案 0 :(得分:2)
您正在重新声明token
:
char *token = NULL; // <-- here
unsigned long value;
int finalv;
char ipaddress[16];
char token[]="."; // <-- and here
稍后在代码中,您会对哪个token
应该在哪个上下文中使用感到困惑。这一点特别明显:
token = strtok( NULL,token);
...其中第一个标记可能是指针而第二个是数组。
我有点惊讶,即使编译了,请注意,但你的编译器至少不会警告你这个吗?
编辑:在“更新”代码中,
fp = fopen(LOGFILE, token);
当token
为NULL
时执行,这会导致未定义的行为。你的意思是
fp = fopen(LOGFILE, "w");
答案 1 :(得分:0)
更改
token = strtok( NULL,token);
到
token = strtok(NULL,".");
PS:因为你每秒调用这个函数数百次,你最好在函数外打开和关闭文件
答案 2 :(得分:0)
而不是循环strtok()
,
int a=0, b=0, c=0, d=0 ;
int value ;
sscanf( ip, "%d.%d.%d.%d", &a, &b, &c, &d );
value = ( ( a * 255 + b ) * 255 + c ) * 255 + d ;
finalv = value % 9999
我认为,应该给你相同的答案。 (虽然在评论中指出,255
可能是256
}。