C - strtol 不从 read(fd,buffer,ssize_t) 转换字符串



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

int getNumFiles(int archive){
off_t cur=lseek(archive,20,SEEK_SET);
if(cur==-1){
    printf("lseek ERRORn");
    exit(-1);
}
bool b=true;
char headerSizeBuffer[4];
char *end;
while(b){
    int numRead=read(archive,headerSizeBuffer,3);
    if(numRead != 3){
        printf("read ERRORn");
        exit(-1);
    }
    headerSizeBuffer[3]='';
    printf("headerSizeBuffer=%s  with length=%ldn",headerSizeBuffer,strlen(headerSizeBuffer));
    long headerSize=strtol(headerSizeBuffer,&end,10);//atol(headerSizeBuffer);
    printf("headerSize=%ldn",headerSize);
    if (!*end)
        printf("Converted successfullyn");
    else
        printf("Conversion error, non-convertible part: %sn", end);
    b=false;
}
return 1;

}

控制台在我运行编译的代码时给我这个

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

我想做的只是将 031 转换为值为 31 的长整型或整数。

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

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

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

char headerSizeBuffer[4];

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

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

最新更新