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/