在函数中使用两次时strtol函数的异常行为

时间:2014-12-26 03:15:45

标签: c string-comparison strtol

在下面的代码中,我一直面临着strtol函数的一些异常行为,因为它没有返回与作为第二个参数传递给expcmp函数的字符串相关联的最后一个值。我没有看到第一个字符串的相同行为。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int16_t  expcmp( char* exp_cmp,char* exp_val)
{

    char DELIM='.';

    int16_t rc=1;

    char *p=NULL;
    char *temp=NULL;
    if(strlen(exp_cmp)>0)
        {
            p=(char*)malloc(sizeof(strlen(exp_cmp)+1));
            strcpy(p,exp_cmp);
            printf("p=%s\n",p);
        }
    if(strlen (exp_val)>0)
        {
            temp=(char*)malloc(sizeof(strlen(exp_val)+1));

            strcpy(temp,exp_val);
            printf("temp=%s\n",temp);
        }

    while (*temp) {
        if (isdigit(*temp)) {
            int16_t val = strtol(temp, &temp, 10);
            printf("temp=%d\n",val);
        }
        else if(*temp!=DELIM)
            {
                rc=0;
                break;
            }
        temp++;
    }

    while (*p) {
        if (isdigit(*p)) {
            int16_t val = strtol(p, &p, 10);
            printf("val=%d\n",val);
        }
        else if(*p!=DELIM)
            {
                rc=0;
                break;
            }
        p++;
    }

    return rc;

}

int main()
{
    int ret_code;
    ret_code=expcmp(".1.7.8.29.41.8153",".1.7.8.29.41.8153");
    return 0;
}

1 个答案:

答案 0 :(得分:3)

您没有为字符串分配足够的空间。您不应使用sizeof(strlen(...)+1),只需使用strlen(...)+1

        p=malloc(strlen(exp_cmp)+1);
        temp=malloc(strlen(exp_val)+1);

sizeof(strlen(...)+1只是size_t值的大小(可能是8个字节),而不是您要复制的字符串的长度。所以你分配的字符串不够长,当你执行strcpy()时,你就会溢出字符串。这会导致未定义的行为。