1

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 转换为值为 31 的 long 或 int。

4

2 回答 2

3

奇怪的是您没有为 headerSizeBuffer 分配空间或足够的空间,并且在调用 printf (开始)和调用 strtol (结束)之间的一段时间内,它被覆盖了。

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

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

char headerSizeBuffer[4];

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

于 2013-01-27T02:19:37.557 回答
1

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

于 2013-01-27T02:06:44.483 回答