新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2019-10-24
- 在线时间
- 7 小时
|
1金钱
strtoul这个函数是将字符串转换为数字的一个函数,使用以下代码在空项目测试以后
发现可以正常转换 即 num2被转换成了1234。
//测试环境
void fun(){
unsigned long num2=0;
char numlocation[25]="1234";
num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);
}
装入实际工程以后,发现stroul这个函数开始犯病,出现了一个玄学错误。代码如下
void fun2(){
unsigned long num2=0;
unsigned long num3=0;
char numlocation[25]="1234";
char numlocation2[25]="2234";
num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);
num3=(unsigned long)strtoul((const char *)numlocation,NULL,10);
}
结果发现num3转换正常,num3=2234,但是num2 得出的结果是num2=234,即首位的1莫名奇妙的丢了,当我把要转换的字符串改为"1123"时,发现转换后的数字
为23,即位于数组前面的多个1都不能被转换,但是当我把要转换的字符串改为"2123"时,即字符串首位不为1时,num2竟然又转换正常了。
百思不得其解研究了2小时发现,在真实环境下的代码实际是这样的
void fun2(){
unsigned long num2=0;
char numlocation[25]="1234";
//位置1
char otherstring[2000]={}; //中间夹杂了别的数组
//位置2
}
发现num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);这句话放在位置1,则转换正常,放在位置2,则转换出错,错误如上。
故考虑是否是某些空间不足导致,因为需求原因,临时变量申请的比较多,故更改了启动文件的堆栈大小的定义,扩大了堆栈区,最终终于转换正确。
自己是个新手 总结了几个问题想问问大家:
1.为何堆栈空间不足会导致stroul函数出现莫名其妙的问题?
2.为了保证代码运行正确,堆栈区的大小应该怎么设置?设置成多少?如果空间不够,应该如何查看?
3.楼主之所以要开辟大空间的临时变量,是因为要完成一个文件读写的问题:我需要读一个几百字的txt,从中间找到我需要的一个特定字符串的位置,更改部分内容,再写回原位置,我的思路是直接把整个文件读
到一个数组中,然后再判断,所以我需要开辟一个大空间的临时变量,各位有没有什么好办法,让我可以每次读少点内容,还可以定位到我的特定字符串位置?
|
|