【发布时间】:2013-01-10 17:02:04
【问题描述】:
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 转换为值为 31 的 long 或 int。
【问题讨论】:
-
您没有显示每个变量的声明,因此很难确定。
read()不保证字符串的空终止。 OTOH,strlen()as 3 的报告表明你应该没问题,你不应该在*end中得到奇数。您的代码是否在没有警告的情况下编译?是否包含所有标题(<unistd.h>、<string.h>、<stdlib.h>、<stdio.h>)? -
声明出现在我向您展示的代码之前,它们就像这样 char* headerSizeBuffer;字符 * 结束;是的,我拥有所有这些头文件,并且在编译时没有收到警告
-
问题是你没有为 headerSizeBuffer 分配空间!您正在使用未初始化的指针。
-
@JonathanLeffler 不要去点击来自 SO 的那些“点击更新”消息。 :-)