在访问由strtok返回的指针时解决超出范围的问题

时间:2013-09-27 19:12:18

标签: c pointers strtok

在一个帖子中,我正在使用fgets()从文件中读取输入。 fgets()给了我buf,当我标记化时,返回的char指针表示地址越界

char buf[1024];
char data[1024];//for use of strtok
char* dptr = NULL;
memset(&data,0,sizeof(data));
memset(&buf,0,sizeof(buf));
if(NULL != fgets(buf,1024,fp))
{
    /*remove new line char from fgets input*/
    if(buf[strlen(buf)-1] == '\n')
    {
        buf[strlen(buf)-1] = '\0';
    }
    /*making a local copy of buffer for strtok use*/
    strncpy(data,buf,1024);


    /*Get value 1 */
    dptr = NULL;
    char* rs;
    dptr = strtok_r(data," ", &rs);
    if(dptr == NULL)
    {
        fprintf(stderr,"incorrect file format\n");
        return -1;
    }
            /*dptr is not NULL but cannot access it even in gdb*/
    int temp = atoi(dptr);//accessing dptr here gives address out of bound error.

我认为使用指针dptr访问数据缓冲区存在一些问题。但是无法分析它。我尝试使用sscanf和数组元素替换进行标记化和访问,这样就可以了 -

dptr = buf;
int i=0;
    while(*dptr != '\n' || *dptr != '\0' && i<1024)
    {
        if(*dptr == '\t')
        {
            buf[i] = '\0';

        }
        dptr++;
        i++;
    }
    char  v1[256],v2[256],v3[256];
    sscanf(buf,"%s %s %s",v1,v2,v3);

1 个答案:

答案 0 :(得分:2)

如果您不包含&lt; string.h&gt;在调用strtok_r之前,它将被隐式声明为返回'int'。如果您的指针大小不同(因为它位于64位计算机上),则返回值将被符号扩展(或零扩展,我不确定)为64位。这将导致指针无效。你应该包括&lt; string.h&gt;。