谁能解释一下atoi的实现?

jigsaw 2006-01-15 11:57:05
请先看如下程序:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char *
getnumber1(void);

void
getnumber2(char *);

int main()
{
int i = 0;
char w[20];
i = atoi(getnumber1());
printf("getnumber1 = %d\n", i);
i = 0;
getnumber2(w);
i = atoi(w);
printf("getnumber2 = [%s]\n", w);
printf("getnumber2 = %d\n", i);
return 0;
}

char *
getnumber1(void)
{
char w[20];
char *p;
int c;

p = w;
while (isspace(c = getchar()))
;
if (c != EOF)
*p++ = c;
for (;;) {
if (isspace(c = getchar())) {
ungetc(c, stdin);
break;
}
*p++ = c;
}
*p = '\0';
printf("getnumber1 = [%s]\n", w);
return w;
}

void
getnumber2(char *w)
{
char *p;
int c;

p = w;
while (isspace(c = getchar()))
;
if (c != EOF)
*p++ = c;
for (;;) {
if (isspace(c = getchar())) {
ungetc(c, stdin);
break;
}
*p++ = c;
}
*p = '\0';
return;
}

这个小代码没有考虑各种边界情况和错误处理。
用bc++5.5的编译器编译后,运行。
输入和输出如下:
D:\c\scan>getnum
12
getnumber1 = [12]
getnumber1 = 1
12
getnumber2 = [12]
getnumber2 = 12

请问为什么getnumber1读入的char*为12,但是atoi的结果却是1?
同时,getnumber2读入的也是12,atoi的结果是对的。
...全文
485 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jigsaw 2006-01-16
  • 打赏
  • 举报
回复
谢谢大家 给分
Mr_Yang 2006-01-16
  • 打赏
  • 举报
回复
不能返回指向栈内存的指针.
zcz0918 2006-01-16
  • 打赏
  • 举报
回复
如果实在不想改:
char *
getnumber1(void)
{
static char w[20];//加个static也行
char *p;
int c;

p = w;
while (isspace(c = getchar()))
;
if (c != EOF)
*p++ = c;
for (;;) {
if (isspace(c = getchar())) {
ungetc(c, stdin);
break;
}
*p++ = c;
}
*p = '\0';
printf("getnumber1 = [%s]\n", w);
return w;
}

下面是ms的atoi代码
long __cdecl atol(
const char *nptr
)
{
int c; /* current char */
long total; /* current total */
int sign; /* if '-', then negative, otherwise positive */

/* skip whitespace */
while ( isspace((int)(unsigned char)*nptr) )
++nptr;

c = (int)(unsigned char)*nptr++;
sign = c; /* save sign indication */
if (c == '-' || c == '+')
c = (int)(unsigned char)*nptr++; /* skip sign */

total = 0;

while (isdigit(c)) {
total = 10 * total + (c - '0'); /* accumulate digit */
c = (int)(unsigned char)*nptr++; /* get next char */
}

if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
int __cdecl atoi(
const char *nptr
)
{
return (int)atol(nptr);
}
PMsg 2006-01-16
  • 打赏
  • 举报
回复
int myatoi(const char* src)
{
int nub=0,count=0;
while(*src!='\0')
{src++,count++;}
src-=1;
for(int i=0;i<count;i++)
{
nub+=(int(*src)-48)*pow(10,i);
src--;
}
return nub;
}
goodluckyxl 2006-01-16
  • 打赏
  • 举报
回复
就是把所有的char按位来乘得到i类型数据
piaochen_2002 2006-01-16
  • 打赏
  • 举报
回复
getnumber1(void)
参数传递的问题,w[20],临时变量,存放在栈里,函数调用结束的时候被释放,所以你返回的指针是没有意义的!
lgq2369 2006-01-16
  • 打赏
  • 举报
回复
楼上正解。

应该避免返回一个指向局部变量的指针,否则会产生意想不到的结果。

duduhaha 2006-01-16
  • 打赏
  • 举报
回复
这个和atoi关系不大吧,应该和变量生存期有关吧.
每个函数都有它的栈区,函数一返回再访问这个函数的栈区的变量就是不确定的了.
char * getnumber1(void)
{
char w[20];
.......
return w;
}
从这个函数中返回后w[20]的内容就不确定了吧.
而getnumber2之所以正确是因为w[20]定义在main函数中.

69,371

社区成员

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

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