我在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
发布于 2015-01-30 11:37:13
而不是在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
s可能意味着是256
)。
发布于 2015-01-30 11:20:41
你要重新声明token
char *token = NULL; // <-- here
unsigned long value;
int finalv;
char ipaddress[16];
char token[]="."; // <-- and here
在后面的代码中,您会对在哪个上下文中使用哪个token
感到有些困惑。这一点在这里尤为明显:
token = strtok( NULL,token);
...where,第一个令牌应该是指针,第二个是数组。
我有点惊讶,甚至编译,请注意,但您的编译器至少没有警告您这一点吗?
编辑:在“更新”代码中,
fp = fopen(LOGFILE, token);
当token
为NULL
时执行,这将导致未定义的行为。你的意思是
fp = fopen(LOGFILE, "w");
发布于 2015-01-30 11:20:43
变化
token = strtok( NULL,token);
至
token = strtok(NULL,".");
PS:因为您每秒调用此函数数百次,所以最好打开并关闭该函数之外的文件。
https://stackoverflow.com/questions/28234669
复制相似问题