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。
答案 0 :(得分:3)
你可能没有为headerSizeBuffer分配空间或足够的空间,并且在调用printf和调用strtol(结束)之间(开始)之间会被覆盖。
编辑:从上面的评论:“char * headerSizeBuffer”
是的,我是对的。由于您没有分配任何空间,因此您有未定义的行为......这意味着可能会发生任何行为,包括您所看到的行为。确保为headerSizeBuffer分配足够的空间,方法是将其设置为指向足够的内存(可以来自malloc,或者它可以是数组,或其他各种不太常见的方法),或者更适合您的情况因为大小需要在编译时知道,将其声明为数组而不是指针:char headerSizeBuffer[4];
确保设置headerSizeBuffer [3] ='\ 0`以在将字符串传递给strtol之前终止该字符串。
答案 1 :(得分:1)
这是因为strtol
需要以空字符结尾的字符串,而read()
只需要3个字符。 strtol
然后看不到字符串的结尾并继续阅读垃圾。您需要设置headerSizeBuffer[3] = 0
。