strtol没有从read中转换字符串(fd,buffer,ssize_t)

时间:2013-01-27 02:00:48

标签: c strtol

strtol不会转换我从阅读文本文件中得到的字符串。

int getNumFiles(int archive){
off_t cur=lseek(archive,20,SEEK_SET);
if(cur==-1){
    printf("lseek ERROR\n");
    exit(-1);
}
bool b=true;
char headerSizeBuffer[4];
char *end;

while(b){
    int numRead=read(archive,headerSizeBuffer,3);
    if(numRead != 3){
        printf("read ERROR\n");
        exit(-1);
    }
    headerSizeBuffer[3]='\0';
    printf("headerSizeBuffer=%s  with length=%ld\n",headerSizeBuffer,strlen(headerSizeBuffer));
    long headerSize=strtol(headerSizeBuffer,&end,10);//atol(headerSizeBuffer);
    printf("headerSize=%ld\n",headerSize);

    if (!*end)
        printf("Converted successfully\n");
    else
        printf("Conversion error, non-convertible part: %s\n", end);
    b=false;
}

return 1;

}

当我运行已编译的代码时,控制台会给我这个

headerSizeBuffer=031l_archive  with length=12
headerSize=31
Conversion error, non-convertible part: l_archive

我想做的就是将031转换为long或int,其值为31。

2 个答案:

答案 0 :(得分:3)

你可能没有为headerSizeBuffer分配空间或足够的空间,并且在调用printf和调用strtol(结束)之间(开始)之间会被覆盖。

编辑:从上面的评论:“char * headerSizeBuffer”

是的,我是对的。由于您没有分配任何空间,因此您有未定义的行为......这意味着可能会发生任何行为,包括您所看到的行为。确保为headerSizeBuffer分配足够的空间,方法是将其设置为指向足够的内存(可以来自malloc,或者它可以是数组,或其他各种不太常见的方法),或者更适合您的情况因为大小需要在编译时知道,将其声明为数组而不是指针:

char headerSizeBuffer[4];

确保设置headerSizeBuffer [3] ='\ 0`以在将字符串传递给strtol之前终止该字符串。

答案 1 :(得分:1)

这是因为strtol需要以空字符结尾的字符串,而read()只需要3个字符。 strtol然后看不到字符串的结尾并继续阅读垃圾。您需要设置headerSizeBuffer[3] = 0