c - strtol 不从读取(fd、缓冲区、ssize_t)转换字符串

标签 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。

最佳答案

很可能您没有为 headerSizeBuffer 分配空间或足够的空间,并且它在对 printf 的调用(开始)和对 strtol 的调用(结束)之间的某个时间被覆盖。

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

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

char headerSizeBuffer[4];

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

关于c - strtol 不从读取(fd、缓冲区、ssize_t)转换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543709/

相关文章:

c - 如何在 Opencl 内核中传递本地地址空间中的数组

在 C 中有效地将十六进制字符串转换为整数?

c - 中断驱动的 UART 中的流处理 - ATMEGA328P

c - 使用strtol过滤不良命令提示符并打印错误消息(C)

c - 调试器对嵌入式应用程序的影响

c - 重新采样声音样本,我使用什么过滤器?

c - 编译问题

c - strtol 未按预期运行,c

c++ - 将 4 字节十六进制字符串转换为整数

c - scanf 不扫描 %c 字符而是跳过该语句,这是为什么?