微软面试题求解:怎样只用4行代码编写出一个从字符串到长整形的函数?

drunkard 2001-05-12 02:51:00
写一个函数,检查字符串是否是整数,如果是,返回其整数值。

在《程序员》杂志2000年试刊1第38页曾提到,对这个问题,微软开发部主管加米尔仅写了4行程序就做出来了,请问他应该是怎么做的?
...全文
1199 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
hproof 2001-09-08
  • 打赏
  • 举报
回复
long stol(char *&p,long &f)
{
long ret=0,s=f=-1;
for((*p=='-')?p++:s=1;*p<='9'&&*p>='0'&&(unsigned long)ret<=MAX_LONG/10;ret=ret*10-'0'+*(p++),f=0);
for(;*p<='9'&&*p>='0';p++,ret=-1);
return (ret<0)?f=s*MAX_LONG:s*ret
hproof 2001-09-08
  • 打赏
  • 举报
回复
我这个小东西的效果是这样的:

输入p 返回值 输出p 标志f 描述
--------------------------------------------------------------
"-001230#" -1230 "#" 0 正常
"abc123#" 0 "abc123" -1 非数值串
"10...00#" MAX_LONG "#" MAX_LONG 正溢出
"-0020..00#" -MAX_LONG "#" -MAX_LONG 负溢出

我认为效果还是不错的,因为它实用性比较大。比如:可以改变p使它指向下一个字符,可以根据标志位进行自己的处理,如果比在意的话,完全可以不考虑标志位,因为无论何时返回值都是有意义的。
代码如下:

#define MAX_LONG 0x8fffffff

long stol(char *&p,long &f)
{
long ret=0,s=f=-1;
for((*p=='-')?p++:s=1;
*p<='9'&&*p>='0'&&(unsigned long)ret<=MAX_LONG/10;
ret=ret*10-'0'+*(p++),f=0);
for(;*p<='9'&&*p>='0';p++,ret=-1);
return (ret<0)?f=s*MAX_LONG:s*ret;
}
widewave 2001-09-07
  • 打赏
  • 举报
回复
long strToLong(str *, n)
{
return ((n > 0)? (*str >= '1' && *str < '0')? (*str - '0'), 0) * 10 + strToLong(str++, n--), 0);
}
不怎么对.
higang 2001-09-07
  • 打赏
  • 举报
回复
int strtolong(char * str,long * ret)
{
int i,j,k,n;
for( i=j=k=n=0,*ret=0;(str!=NULL && ( (j=(*str>='0'&& *str<='9')) ||isspace(*str)||*str=='+'||(i=(*str=='-')) ))&&(!(j==0 && k==1));str++)
*ret= (j==1) ?(k=1,j=0,(*ret)*10+*str-'0'):0;
return(k==1?(i==1?*ret=-*ret:1):0);
}

可以处理
"dzxcvvcvc" -> 0 return 0 --失败
"0000120" -〉120 return 1 --成功
"0000-120" -> 0 return 0 --失败
"00+120" -> 0 return 0 --失败
" +000120 -> 120 retun 1
" -120" ->-120 return 1
"-000120" ->-120 return 1
"\t120\t " -> 120 return 1
不过
"120derfdsf" -> 120 return 1 !!!!
nemo2050 2001-08-31
  • 打赏
  • 举报
回复
对了使用的时候要将 b 设置为零。
nemo2050 2001-08-31
  • 打赏
  • 举报
回复
不知这个算不算, 总觉得写得太繁琐 :(

void StrToLong(char *a, long& b)
{
for(int i=10, j=1; i>=0 && (a[i]>='0'&&a[i]<='9'||a[i]=='-'); i--, j*=10)
(i==0&&a[0]=='-')?b-=b*2:b+=(a[i]-'0')*j;
}
nevsnev 2001-08-31
  • 打赏
  • 举报
回复
#include <stdio.h>
void str2l(const char *str,long *val);
int main()
{
char str[]=" -3278946";
int val = 0;
str2l(str,&val);
printf("val is %d\n",val);
return 0;
}
void str2l(const char *str,long *val)
{
int sig = 0;
while((*str == ' ')?(str++):0);
(*str == '+')?(str++,sig = 1):(*str == '-')?(str++,sig = -1):(sig = 1);
while((*str >= '0' && *str <= '9' && *str != '\0')?(*val = (*val*10) + (*str++-'0')*sig):(0L));
}

这里面只考虑了前面有空格,+、-号的情况,且符号后的字符串是理想的,
lyqof908 2001-08-29
  • 打赏
  • 举报
回复
高手
xmxmlt 2001-08-29
  • 打赏
  • 举报
回复
easy:
BOOL StrToInt( char *str, int *nInt )
{
*nInt = 0;
while( *str >= '0' && *str <= '9' )
*nInt += *nInt*10 + (*str++ -'0');
return *str?TRUE:FALSE;
}
newtoon2002 2001-08-28
  • 打赏
  • 举报
回复
gz
nasco 2001-08-28
  • 打赏
  • 举报
回复
无聊的题目,如果这是微软的面试题目也只能说这个项目组的代码质量绝对高不到什么地方去。

RipperJohn 2001-08-28
  • 打赏
  • 举报
回复
刚才搞错了,现在这个算么?

void atol(char* ch, long *l)
{
while(*ch>='0' && *ch<='9')
*l = (*l)* 10 + *(ch++) -'0';
}
RipperJohn 2001-08-28
  • 打赏
  • 举报
回复
朋友,这个算么?假设字串在ch[]里

long l=0;
int j=0;
while(ch[j]>='0' && ch[j]<='9')
l=l*10 + ch[j++] -'0';
cnss 2001-08-27
  • 打赏
  • 举报
回复
int f(char *str)
{
if(*str=='-')
return -f(++str);
for(int a = 0; *str < 58 && *str > 47; a = 10*a + *str - 48, str++);
return *str ? FALSE : a;
}
cnss 2001-08-27
  • 打赏
  • 举报
回复
刚才贴的不能识别负数,再贴一个,用递归解决了负数的识别
int f(char *str)
{
if(*str=='-')
return -f(++str);
for(int a = 0; *str != NULL && *str < 58 && *str > 47; a = 10*a + *str - 48, str++);
return *str ? -1 : a;
}
cnss 2001-08-27
  • 打赏
  • 举报
回复
只有两行,如果不是长整,返回-1,否则返回值

int f(char *str)
{
for(int a = 0; *str != NULL && *str < 58 && *str >47; a = 10*a + *str - 48, str++);
return *str ? -1 : a;
}
zhiqing 2001-08-27
  • 打赏
  • 举报
回复
不要有思维定势,一行可以写很多句.
jimgreen 2001-08-26
  • 打赏
  • 举报
回复
up
sjzhy 2001-08-25
  • 打赏
  • 举报
回复
for(i=0;i<strlen(str);i++)
if(!isdigit(str[i])||str[i]=='.')return false;
return atoi(str);
gzlucky 2001-08-24
  • 打赏
  • 举报
回复
function IsNumber( sStr as String ) as long
IsNumber = iif (trim(str(val(sStr))) = trim(sStr), val(sStr),-1)
end function
加载更多回复(43)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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