C 字符串未正确标记

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

我在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;
    }
输出文件: (我只给出了错误的输出)


您正在重新声明
令牌

        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