C 字符串未正确标记
我在ip地址上应用一个公式。但它有时会给我一些随机输出,这很奇怪。有时它不能正确地标记,有时它给出0值。在1000个样本中,误差恢复率几乎为2-5。C 字符串未正确标记,c,strtok,atoi,C,Strtok,Atoi,我在ip地址上应用一个公式。但它有时会给我一些随机输出,这很奇怪。有时它不能正确地标记,有时它给出0值。在1000个样本中,误差恢复率几乎为2-5。 调用函数=公式(IPADDRESS); 我每秒用数百个不同的IP呼叫它 int formula ( char ip[]){ char *token = NULL; unsigned long value; int finalv; char ipadd
调用函数=公式(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;
}
输出文件:
(我只给出了错误的输出)
您正在重新声明
令牌
:
char *token = NULL; // <-- here
unsigned long value;
int finalv;
char ipaddress[16];
char token[]="."; // <-- and here
…其中第一个标记可能是指针,第二个标记是数组
请注意,我有点惊讶于它甚至被编译了,但是你的编译器至少没有警告你这一点吗
编辑:在“更新”代码中
当token
为NULL
时执行,这会导致未定义的行为。你是说
fp = fopen(LOGFILE, "w");
?改变
token=strtok(NULL,token)代码>
到
token=strtok(NULL,“.”)代码>
PS:由于每秒调用此函数数百次,因此最好在函数外部打开和关闭文件,而不是循环调用strok()
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
)。token=strtok(NULL,token)
将尝试在ipaddress
中使用上一个令牌作为分隔符来查找下一个令牌。。。?我不认为这是故意的。很抱歉,我粘贴了错误的代码。这是更新后的代码,但我仍然有错误。为什么要乘以255次幂。。。???下一个字节位置对应于权重256。很好,没有捕捉到重新声明。这就解释了第二次调用strtok()
的错误。很抱歉,我粘贴了错误的代码。这是更新后的代码,但我仍然收到了相同的错误。很抱歉,我粘贴了错误的代码。这是更新后的代码,我在其中收到了错误。我将在函数外部移动打开和关闭文件。为什么不使用此技巧,它比您的@user95711简单得多?您不应该将其乘以256吗?我可以说我只是在检查是否有人正确阅读:-)尽管OP使用的是255
。。。要么这是错误的,要么(因为他们使用9999
)进行修改,这可能是某种哈希函数?与原始问题中的“错误”相同,我想您只是从那里复制了常量。:)散列函数?可能地
fp = fopen(LOGFILE, token);
fp = fopen(LOGFILE, "w");
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