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
。