[问题] C语言实作atoi

楼主: penril0326   2014-11-13 01:02:44
各位大大好,小弟最近在练程式实作atoi这个function
却发生一个问题我怎么想都不知道错在哪
atoi是把一个字串转成int型态
我的错误是如果我的字串是 char s[]="-123";
结果输出会是-122,也就是说我目前唯一发现有问题的地方是
只要输入是"负号且3位数",结果就会少1
(ex:-987变成-986)
非3位数跟正整数就不会有这问题
叫朋友帮我编译他说他没问题
但我自己的电脑跟学校电脑都会这样
想请版上高手帮我解答,我使用的编译器是code::blocks
以下是code
int Myatoi(char* s)
{
int sum=0,i=0,count1=0;
int j,lenght,count2;
lenght = strlen(s);
if (s[0] != '-')
{
if (s[0] < '0' && s[0] > '9')
{
return 0;
}
else
{
while (s[i] >= '0' && s[i] <= '9')
{
count1++;
i++;
}
count2 = count1 - 1;
for (j=0;j<count1;j++)
{
sum = sum + ((int)(s[j] - '0')) * pow(10,count2);
count2
作者: KoenigseggG (地表最速)   2014-11-13 01:21:00
你可以加入一些printf看看哪里出错了是说 if (s[0] < '0' && s[0] > '9') 这不会true吧当然啦~学习用 debugger 很重要。
作者: LPH66 (-6.2598534e+18f)   2014-11-13 01:36:00
我觉得问题是在 pow(10,count2) 上, 这是浮点数函数所以不保证回传回来的浮点数会正好整数, 在转成 int 时截掉小数就造成误差了;其实你可以不用 pow 来写的提示: 想想怎么从 12 和 3 算出 123 来
作者: carylorrk (carylorrk)   2014-11-13 02:02:00
让我想到有人说,学习一个语言的 debug 方式才能说你学过这个语言XD
作者: PoorLoser (废文制造机)   2014-11-13 02:18:00
1. pow() 回传 float2. int * float 会转型成 float * float3. pow() 指数浮点运算有精度问题, 可能回传 999.99...4. 假设输入 456, 可能得到 455.9999XX... ...5. 再转型成 int, 舍弃小数就少了 1不过正整数没问题就有点怪
作者: phishingphi (hsnutontu)   2014-11-13 02:57:00
什么时候code::blocks是编译器...devC这个...应该不妥吧, code应该有问题.
作者: Caesar08 (Caesar)   2014-11-13 05:45:00
我想给个建议,你可以先把-从字串里面移除,这样你就不用写2段一模一样的code
作者: KoenigseggG (地表最速)   2014-11-13 07:35:00
他想说c::b是IDE吧。其实我昨晚用你code测-123是对的(gcc 4.8.1), float pow()这我没注意到艸我还是认为不会true啊~虽然问题应该不在这0.0让我想到大一考试,同一份code, c::b跑出TA给的答案工作站(linux)直接Segmentation fault......从此抛弃c::b(?)是说为啥跟下面那篇都会想用pow()做啊0.0需求是转int就像LPH大大说的那样
作者: dirkc (3781615)   2014-11-13 09:22:00
的确pow,strlen都不需要,另外原始atoi()可以处理前缀空白atoi也有考虑INT_MAX/INT_MIN; 不过简化难度来练习也不错:)
作者: KoenigseggG (地表最速)   2014-11-13 22:01:00
'0' -> 48, '9' -> 57. 不会 97 < 48 && 97 > 57.还是我哪里错艸。我用vim+gcc喔~我也不知为何会这样LPH大大应该是说 12 * 10 + 3 = 123?嗯,害我每次推文前都再查一次表XD说不定真的没这么简单@@因为那是我的作法,我猜的
作者: dirkc (3781615)   2014-11-14 09:08:00
如楼上所说,if/while就可以做了,没什么高深的语法
作者: Jimmy0301 (Jimmy)   2014-11-17 23:56:00
其实判断空白可以用 isspace,判断是否为数字 isdigit这我写的但不一定对http://codepad.org/T4bO1QeU

Links booklink

Contact Us: admin [ a t ] ucptt.com