在一个帖子中,我正在使用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);
答案 0 :(得分:2)
如果您不包含&lt; string.h&gt;在调用strtok_r之前,它将被隐式声明为返回'int'。如果您的指针大小不同(因为它位于64位计算机上),则返回值将被符号扩展(或零扩展,我不确定)为64位。这将导致指针无效。你应该包括&lt; string.h&gt;。