atoi函数能否转换非数字字符串?

marsara 2008-11-04 01:27:47
关于atoi的用法有点疑问,大家先看这样一道题吧:
有以下自定义函数calc

void calc(char *s)
{
int t=0;
while(*s){
if(isdigit(*s)||*s=='-')
t+=atoi(s); //这里不是太清楚,如果碰到的是'-'减号,atoi怎么转换?
++s;
}
printf("t= %d\n",t);
}

假设给定字符串为“11+22-33-44”,作为calc函数的参数,求其执行结果?

...全文
750 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
marsara 2008-11-05
  • 打赏
  • 举报
回复
嗯,太感谢你了呵,bluerush,我现在完全理解了,原来是这样传递的,万分感谢!
bluerush 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 marsara 的回复:]
引用 1 楼 bluerush 的回复:

答案是43。
执行过程是:
执行过程:11+1+(jump)+22+2-33+33+3-44+44+4


嗯,对于执行过程能否说得再详细一点呢?
为什么是第一个读取的是11而不是从1开始?
while(*s){
    if(isdigit(*s)||*s=='-')
      t+=atoi(s);   
    ++s;
}
我好像对while循环还不是太理解,s指针应该是一个一个字符读取的呀,为什么会得到11,22等之类2个字符组成的数据呢,希望大家能再仔细说明一下咯,谢谢呵
[/Quote]

这个地方你可以理解为函数atoi()的参数是一个字符串,所以,
循环第一遍传入的是11+22-33-44,获得数字11(解析到+号后后面的因为不能构成合法整数,舍弃)
循环第二遍传入的是1+22-33-44,获得数字1(解析到+号后后面的因为不能构成合法整数,舍弃)
循环第三遍传入的是+22-33-44,isdigit(*s)返回0,所以jump
循环第四遍传入的是22-33-44,获得数字22(解析到-号后后面的因为不能构成合法整数,舍弃)
循环第五遍传入的是2-33-44,获得数字2(解析到-号后后面的因为不能构成合法整数,舍弃)
循环第六遍传入的是-33-44,获得数字-33(解析到第二个-号后后面的因为不能构成合法整数,舍弃)
循环第七遍传入的是33-44,获得数字33(解析到-号后后面的因为不能构成合法整数,舍弃)
循环第八遍传入的是3-44,获得数字3(解析到-号后后面的因为不能构成合法整数,舍弃)
循环第九遍传入的是-44,获得数字-44
循环第十遍传入的是44,获得数字44
循环第十一遍传入的是4,获得数字4
循环结束,各个数字相加,得43
marsara 2008-11-04
  • 打赏
  • 举报
回复
while(*s){
if(isdigit(*s)||*s=='-')
t+=atoi(s);
printf("*s= %c\t",*s);
++s;
}
我在while中加了输出语句,可以看到字符指针*s读取的字符,*s是一个一个读取的,但t为何一开始就是11呢?
我总是觉得应该是1+1(jump)+2...这样一个一个下去的,当然结果是不对的,该怎么理解呵?
elegant87 2008-11-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
char *a="-4568";
char *b="456";
int m,n;
m=atoi(a);
cout<<"m="<<m<<endl;
n=atoi(b);
cout<<"n="<<n<<endl;
system("pause");
return 0;
}
//结果:
m=-568
n=456
marsara 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluerush 的回复:]
答案是43。
执行过程是:
执行过程:11+1+(jump)+22+2-33+33+3-44+44+4
[/Quote]

嗯,对于执行过程能否说得再详细一点呢?
为什么是第一个读取的是11而不是从1开始?
while(*s){
if(isdigit(*s)||*s=='-')
t+=atoi(s);
++s;
}
我好像对while循环还不是太理解,s指针应该是一个一个字符读取的呀,为什么会得到11,22等之类2个字符组成的数据呢,希望大家能再仔细说明一下咯,谢谢呵
pingmail 2008-11-04
  • 打赏
  • 举报
回复
楼上正解
tian428 2008-11-04
  • 打赏
  • 举报
回复
atoi支持第一位字符是-或+啊
bluerush 2008-11-04
  • 打赏
  • 举报
回复
答案是43。
执行过程是:
执行过程:11+1+(jump)+22+2-33+33+3-44+44+4

70,035

社区成员

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

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