C语言中函数atoi的理解问题

asasikaimu 2015-01-23 10:25:47
函数atoi 和strtol 主要用处是什么?字符串的基数转换是什么原理呢?
...全文
324 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-01-24
  • 打赏
  • 举报
回复
另外还有atof与strtod这两个函数,可以把字符串转换成符点型变量
paschen 2015-01-24
  • 打赏
  • 举报
回复
原理的话你可以自己写一个就明白了,比如:

int my_atoi(const char* p)
{
	if(p==NULL)
		exit(1);
	bool neg_flag=false;  //符号标记
	int res=0;    //结果
    if(p[0] == '+' || p[0] == '-')
		neg_flag = (*p++ != '+');
	while(isdigit(*p))
		res = res * 10 + (*p++ - '0');
	return neg_flag ? -res : res;
}
paschen 2015-01-24
  • 打赏
  • 举报
回复
用处都是字符串转成整型变量 /************************************************************ C语言库函数名: atoi、atol 功 能: 把字符串转换成整型数(长整型数). 名字来源:array to integer 的缩写. 原型: int atoi(const char *nptr); long atol(const char *nptr); 函数说明: 参数nptr字符串,如果第一个非空格字符不存在 或者不是数字也不是正负号则返回零,否则开始做类型转换, 之后检测到非数字(包括结束符 \0) 字符时停止转换, 返回(长)整型数。如果传入的字符串为空,或者字符串包含 的内容非阿拉伯数字序列,则函数返回默认值0。 附加说明:atol()与使用strtol(nptr,(char**)NULL,10);结果相同 头文件: #include <stdlib.h> *************************************************************/ /******************************************************************************************* strtol 函数及其参数   long int strtol(const char *nptr,char **endptr,int base); 函数的解释说明   这个函数会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。 参数base代表采的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。 当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换、 遇到'0'前置字符而不是'0x'的时候会使用8进制做转换。一开始strtol()会扫描参数nptr字符串, 跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串 结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止 的nptr中的字符指针由endptr返回;若参数endptr为NULL,则会不返回非法字符串。 strtol是atoi的增强版,主要体现在这几方面:   1.不仅可以识别十进制整数,还可以识别其它进制的整数,取决于base参数。   2.endptr是一个传出参数,函数返回时指向后面未被识别的第一个字符。可以据此判断出错的情况。   3.如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的 最大(或最小)整数,并设置errno为ERANGE。 而strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。用法和strtol类似。 ********************************************************************************************/
赵4老师 2015-01-23
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 参考 CRT\SRC\ATOX.C CRT\SRC\STRTOL.C 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步atoi和strtol函数对应的汇编代码几步后,就会来到该函数对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
Yick__ 2015-01-23
  • 打赏
  • 举报
回复
百曉生 2015-01-23
  • 打赏
  • 举报
回复

其实可以自己先试试谷歌百度的

东莞某某某 2015-01-23
  • 打赏
  • 举报
回复
看了文档后你会发现后者比前者更灵活,更安全,更强大。 比如 atol("aaaaaaa"),会返回0,但这里是逻辑不安全的,你不知道是否真的是字符串"0" 而strtol,有了第二个参数就可以避免这个问题了:
char* end;
  int val = strtol("aaaaa", &end, 10);

  if ( *end )
    fprintf(stderr,"string invalide\n");
  else
    printf("Conversion ok\n");
QIUSQJF 2015-01-23
  • 打赏
  • 举报
回复
有时间在这里问,还不如google搜索一下,更全面更详细……
starnight_cyber 2015-01-23
  • 打赏
  • 举报
回复
顶楼上的大神... 楼主,你手上应该有C语言函数库文档,在不清楚的时候以便查看!你说的两个函数可以在文档中查得。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧