首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] HELP!我是C新手,看到两个oracle的C语言面试题


来源 chinaunix.net kuqin整理

1) 使用C语言写出以下函数,给你三个变量a,b,c,请不使用其他变量的情况下交换他们的值,使得a=b, b=c, c=a;

2) 使用C语言写出以下函数,给你一个用字符串表示的整数,请写一个函数把该字符串转化成为整数,并要求处理异常情况。函数体中的语句不能超过5句

就上面两个,想了一下不会做,高手来解答下呢!



 wyaccent 回复于:2007-01-09 21:36:42

题目跟ORACLE有上面关系呢?不解!!


 bleem1998 回复于:2007-01-09 21:57:03

好难啊
第一个好象以前讨论过
但是忘记鸟啊


 langue 回复于:2007-01-09 22:01:48

引用:原帖由 bleem1998 于 2007-1-9 21:57 发表
好难啊
第一个好象以前讨论过
但是忘记鸟啊 



加加减减 :)


 bleem1998 回复于:2007-01-09 22:11:08

好是的
而且还讨论过不会溢出
right?
a = 1
b = 2

a = a + b
b = a - b
a = a - b


 bleem1998 回复于:2007-01-09 22:22:26

写了个
远远超过5句
sigh

int str2int(char *str, int *ret)
{
    int xx = 1;
    if (str == NULL) return -1;
    if (*str++ == '-')
        xx = -1;
    while(str && *str) {
        if ((*str >= '0') && (*str <= 9))
            *ret = (*ret * 10) + *str - '0';
        else
            return -1;
    }
    *ret *= xx;
    return 0;
}



 wyaccent 回复于:2007-01-09 22:30:28

c = (a+c)-(a=b,b=c);


 Edengundam 回复于:2007-01-09 22:34:20

第二题考虑符号...我实在是...不行了...

void
exchange(int *a, int *b, int *c)
{
    *a = *a + *b + *c;
    *c = *a - *b - *c;
    *b = *a - *b - *c;
    *a = *a - *b - *c;
}


8行...我实在想不出来了...如果不要求代码格式...估计5行..还有点希望....

void
atoi(char *str, int *rc)
{
    *rc = 0;
    if (str == NULL)
        return ;
    int sign = (*str != '-' ? 1 : 0); /* only for ... c99 */
    str = (*str == '-' || *str == '+') ? str + 1 : str;
    while ((*str) && isdigit(*str))
        *rc = *rc * 10 + (*str++ - '0');
    *rc = (sign) ? *rc : -*rc;
}


[ 本帖最后由 Edengundam 于 2007-2-12 17:50 编辑 ]


 路小佳 回复于:2007-01-09 22:36:53

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;

[ 本帖最后由 路小佳 于 2007-1-9 22:50 编辑 ]


 zwylinux 回复于:2007-01-09 23:34:13

引用:原帖由 路小佳 于 2007-1-9 22:36 发表
a ^= b ^= c ^= a ^= b ^= c ^= a ^= b; 



强,不过没看懂


 _google 回复于:2007-01-10 10:44:45

顶下看


 ghostwwl 回复于:2007-01-10 11:06:31

第一个 用 加加减减 和 异或 都可以做


 boxpei 回复于:2007-01-10 12:37:54

第二题 atoi 
没说不能用标准库函数


 wjfree 回复于:2007-01-10 13:22:56

引用:原帖由 wyaccent 于 2007-1-9 22:30 发表
c = (a+c)-(a=b,b=c); 



太强了!佩服!


 新手上路2世 回复于:2007-01-10 14:05:56

  a ^= b;
  b ^= a;
  a ^= b;


 mu_mu8309 回复于:2007-01-10 14:49:24

引用:原帖由 wyaccent 于 2007-1-9 22:30 发表
c = (a+c)-(a=b,b=c); 





 rexlee 回复于:2007-01-10 15:09:43

引用:原帖由 mu_mu8309 于 2007-1-10 14:49 发表

顶 



顶,厉害


 wyaccent 回复于:2007-01-10 15:19:20

int strtoint (char *p, int *i)
{
   for (; *p != 0; p++)
   {
      if (*p < '0' || *p > '9')
         return -1;
      i = (i*10) + (*p&0x0f);
   }
   return 0;
}

加上报错就多了两行,郁闷
而且有缺陷,不能处理负数的情况,还得思考思考

[ 本帖最后由 wyaccent 于 2007-1-10 15:35 编辑 ]


 dulao5 回复于:2007-01-10 15:39:28

惭愧,只能处理unisgned int

int char2uint(char *p, unsigned int * pi)
{
for(*pi = 0 ; *p; p++) {
if(*p<48 || *p>57) return -1;
*pi = *pi * 10 + *p - 48 ;
}
return 0;
}




 lan_wjz 回复于:2007-01-10 16:34:52

a=a+b
b=a-b
a=a-b
c=c+b
b=c-b
c=c-b


 blackuhlan 回复于:2007-01-10 16:45:30

the first program is
b=a+b;
a=b-a;     // a=b;
b=b-a;     // b=a;
c=b+c;     // c=a+c;
b=c-b;     // b = c;
c=c-b;     // c = a;


 独孤九贱 回复于:2007-01-10 17:16:33

int my_atoi(char *str)

{
int i,sum = 0,flag = 0,len = strlen(str);

for(i = len -1; i >= 0 && flag >= 0;i--)
{
(isdigit(str) == 0) ? (flag = (str[0] == '-') ? 1 : -1) : (sum += (int)((str - 48) * pow(10,len-i-1)));
}
return (flag == 0) ? sum : -sum;
}


只能处理整数,不能处理长整型,好像题中也没有要求长整型,有出错处理(flag == -1),但是我不知道应该返回什么值给调用程序……:em02:


 hiwoody 回复于:2007-01-10 17:41:00

真强 这些人啊  好好学习了


 Nickwong 回复于:2007-01-10 17:47:26

c = (a+c)-(a=b,b=c); 
经过测试是错误的!

结果:a,b赋值符合要求,c赋值错误.

[ 本帖最后由 Nickwong 于 2007-1-10 17:48 编辑 ]


 HeavenTear 回复于:2007-01-10 18:09:46

a ^= b;
b ^= a;
a ^= b;

=====
int atoi( const char* val, int& status )
{
int result =0 ;

while(  *val >= '0' && *val <= '9'  && *val != '\0' )
{
   result = result* 10 + *val - '0', val++;
  
}

return *val == '\0' ? ( staus = 1, result ): ( status =0, -1 );

}

[ 本帖最后由 HeavenTear 于 2007-1-10 22:09 编辑 ]


 wyaccent 回复于:2007-01-10 19:24:00

引用:原帖由 Nickwong 于 2007-1-10 17:47 发表
c = (a+c)-(a=b,b=c); 
经过测试是错误的!

结果:a,b赋值符合要求,c赋值错误. 




验证通过
你是什么编译器


 cubzsd 回复于:2007-01-10 20:25:19

菜哦,C的函数强的可以写在一句上.是你太不了解C了


 yszll 回复于:2007-01-10 21:00:36

引用:原帖由 Nickwong 于 2007-1-10 17:47 发表
c = (a+c)-(a=b,b=c); 
经过测试是错误的!

结果:a,b赋值符合要求,c赋值错误. 



[root@cent c]# cat a.c
#include <stdio.h>
int main()
{
        int a=22,b=33,c=44;
        c = (a+c)-(a=b,b=c);
        printf("%d,%d,%d\n",a,b,c);
        a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;
        printf("%d,%d,%d\n",a,b,c);
        return 0;
}
[root@cent c]# ./a.out 
33,44,22
44,22,33
[root@cent c]# 

我测这2个怎么都是对的?


 phantomblue 回复于:2007-01-11 10:10:07

第一题只能用异或来做,用加减得没有考虑到溢出的问题.


 yi_3 回复于:2007-01-11 10:45:45

c = (a+c)-(a=b,b=c); 
这个是错误的,大部分编译器都会解释成:
b=c;
a=b;
c=(a+c)-a;
显然错误了, 结果b=c0; a= b0; c=b0


 yi_3 回复于:2007-01-11 10:54:11

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;
这个没问题,牛X
a = a 0 ^ b0;
c = c0 ^ a0 ^b0;
b = b 0 ^ c ----- b0 ^ c0 ^ a0 ^ b0 ---- c0  ^ a0
a = a ^ b ---- a0 ^ b0 ^ c0 ^ a0 ---- b0 ^ c0
c = c ^ a ---- c0 ^ a0 ^ b0 ^ b0 ^ c0 ---- a0
b = b ^ c ---- c0 ^ a0 ^ a0 ---- c0
a = a ^ b ---- b0 ^ c0 ^ c0 ---- b0
所以结果就是c = a0; b = c0; c = a0;
没有问题;


 tyc611 回复于:2007-01-11 11:22:42

引用:原帖由 wyaccent 于 2007-1-9 22:30 发表
c = (a+c)-(a=b,b=c); 


引用:
ISO/IEC 9899:1999 6.5.3
Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), [color=Red]the order of evaluation of subexpressions [/color]and the order in which side effects take place [color=Red]are both unspecified[/color].



[ 本帖最后由 tyc611 于 2007-1-11 11:24 编辑 ]


 icytear 回复于:2007-01-11 11:23:10

int c_atoi(char *s, int *err)
{
        int i, sum=0;
        for ( i= s!=NULL? s[0]=='-' ? 1 : 0 : 0; (s!=NULL) && (s>='0') && (s<='9'); i++)
                sum = sum*10 + s - '0';       
        return (s!=NULL)&&(s=='\0') ? (*err=0, s[0]=='-'? -sum : sum) : (*err=-1,s[0]=='-'? -sum : sum);
}

[ 本帖最后由 icytear 于 2007-1-11 17:14 编辑 ]


 zwylinux 回复于:2007-01-11 11:30:05

对于第一个问题作个规律性的总结,n个数的交换
n1,n2,n3,......,nn
计算地步骤:
n1=n1+n2+....+nn

nn=n1-n2-...-nn
...
...
n2=n1-n2-...-nn
n1=n1-n2-...-nn
也就是先计算最后一个值,然后是前面的,其实等式的右边都是一样的


 tyc611 回复于:2007-01-11 12:14:32

引用:原帖由 yi_3 于 2007-1-11 10:45 发表
c = (a+c)-(a=b,b=c); 
这个是错误的,大部分编译器都会解释成:
[color=Red]b=c;
a=b;[/color]
c=(a+c)-a;
显然错误了, 结果b=c0; a= b0; c=b0 


应该是先a=b,再b=c,至于operator - 两边的操作数的计算次序是未指定的。


 wyaccent 回复于:2007-01-11 14:35:32

逗号表达式的顺序问题


 DraculaW 回复于:2007-01-11 14:45:36


void swap(int& a, int& b){
        a = a + b;
        b = a - b;
        a = a - b;
}

swap(a,b);
swap(b,c);



这样子就好了阿  很简单的

[ 本帖最后由 DraculaW 于 2007-1-12 13:51 编辑 ]


 fengwy 回复于:2007-01-12 10:07:01

oracle怎么出这种题?要搞研发的人?


 yi_3 回复于:2007-01-12 12:07:29

引用:原帖由 tyc611 于 2007-1-11 12:14 发表

应该是先a=b,再b=c,至于operator - 两边的操作数的计算次序是未指定的。 



恩,是,确实是和编译器相关的:
从VC6编译出的代码来看:
应该是:
a=b;
(a+c);
b=c;
(a+c) - b;
c = (a + c) - b
所以最后结果是:
a = b0; b = c0; c = (b0 + c0) - c0 = b0;
:-)
我估计gcc编译出来的可能不太一样 :)
所以这样的表达式如果相互应用变量的话,副作用很大 :)


 lovesaka 回复于:2007-01-12 16:12:49

第一题已经有了很好的答案,记得以前有个算法用位来的一位一位的换
第二题还没有五句应该算答案

long strtol(const char *ptr)
{
    long len,res,val=1;
    for(len=strlen(ptr);len--&&ptr[len]>='0'&&ptr[len]<='9';val*=10)
         res+=val*(ptr[len]-'0');
    return (len>0)?(-1):(res);
}



 lovesaka 回复于:2007-01-12 16:36:56

如果考虑负数的话换最后一句

long strtoint(const char *ptr)
{
    long len,res,val=1;
    for(len=strlen(ptr);len--&&ptr[len]>='0'&&ptr[len]<='9';val*=10)
         res+=val*(ptr[len]-'0');
    return (len>0)? (-1):(len<0)?res:(ptr[len]=='-')?(~res+1):-1;
}



 koolcoy 回复于:2007-01-12 16:45:11

引用:原帖由 phantomblue 于 2007-1-11 10:10 发表
第一题只能用异或来做,用加减得没有考虑到溢出的问题. 


错误的.

如果相加有overflow, 那么相减的时候就会发生underflow. 所以溢出就抵消了.:em02:


 beyond2004 回复于:2007-01-12 21:22:33

引用:原帖由 icytear 于 2007-1-11 11:23 发表
int c_atoi(char *s, int *err)
{
        int i, sum=0;
        for ( i= s!=NULL? s[0]=='-' ? 1 : 0 : 0; (s!=NULL) && (s>='0') && (s<='9'); i++)
                sum =  ... 


循环中s一直没变啊


 _google 回复于:2007-01-14 11:53:39

any more ?


 tyc611 回复于:2007-01-14 12:13:19

引用:原帖由 koolcoy 于 2007-1-12 16:45 发表

错误的.

如果相加有overflow, 那么相减的时候就会发生underflow. 所以溢出就抵消了.:em02: 


如果是signec类型,溢出是未定义行为,此时肯定不能用加减做;
如果是unsigned类型,由于溢出规则是有定义的(取模运算),而取模运算可以保证溢出取模后的计算结果与不取模的计算结果一致,所以此时可以用加减来计算。

例如:
unsigned char a = 255;
unsigned char b =1;

如果用:
a = a + b;
b = a - b;
a = a - b;
来计算,那么
第一步:a = 255 + 1 =0 (256 mod 256)
第二步:b = 0 - 1 = 255 (= 256 - 1)
第三步:a = 0 - 255 = 1 (= 256 - 255)
此时就交换了a和b

[ 本帖最后由 tyc611 于 2007-1-14 12:16 编辑 ]


 converse 回复于:2007-01-14 12:17:07

有点意思,加精做个保留。


 tyc611 回复于:2007-01-14 16:31:24

引用:原帖由 converse 于 2007-1-14 12:17 发表
有点意思,加精做个保留。 


禁止灌水:mrgreen:

PS:偶是来学习的:mrgreen:


 huntrsky 回复于:2007-01-14 16:45:43

这样写不犯法,且清晰

__asm
{
push a;
push b;
push c;
pop b;
pop a;
pop c;
}



 converse 回复于:2007-01-14 16:48:12

引用:原帖由 huntrsky 于 2007-1-14 16:45 发表
这样写不犯法,且清晰

__asm
{
push a;
push b;
push c;
pop b;
pop a;
pop c;
}
 



算你狠:shock::shock::lol::lol:


 huntrsky 回复于:2007-01-14 16:54:20

是编译器狠才对哈
溢出问题也解决了


 tyc611 回复于:2007-01-14 16:58:06

引用:原帖由 huntrsky 于 2007-1-14 16:45 发表
这样写不犯法,且清晰

__asm
{
push a;
push b;
push c;
pop b;
pop a;
pop c;
}
 


还是汇编牛X


 langue 回复于:2007-01-14 17:11:01

引用:原帖由 huntrsky 于 2007-1-14 16:45 发表
这样写不犯法,且清晰

__asm
{
push a;
push b;
push c;
pop b;
pop a;
pop c;
}
 



伟大的数据结构 :)


 融化的冰山 回复于:2007-01-15 10:08:12

引用:原帖由 huntrsky 于 2007-1-14 16:45 发表
这样写不犯法,且清晰

__asm
{
push a;
push b;
push c;
pop b;
pop a;
pop c;
}
 




你这样写等于是使用了三个临时变量,这样作肯定不符合题目要求的。


 fxyxsl 回复于:2007-01-18 11:19:08

引用:原帖由 融化的冰山 于 2007-1-15 10:08 发表



你这样写等于是使用了三个临时变量,这样作肯定不符合题目要求的。 



赞同这个观点,不过用汇编到是非常的有新意。


 okyzx 回复于:2007-02-03 17:15:53

用汇编确定有创意,相信ORACLE人员会算你是对的,虽然他们要的不是这种答案,但这个答案会出乎他们的想像。

对了上面的汇编只能在MS C下编译通过,在GCC下是没办法编译的,有没高手,翻译个GCC的版本


 andyxie407 回复于:2007-02-03 17:33:05

好象可以用位运算可以搞定


 blackuhlan 回复于:2007-02-03 23:54:38

int atoi( char * str )
{
    return ( *str == 0)? atoi(++str)/10:(*str == '-' )? -1*atoi( ++str ):(*str >= '0' && *str <= 9 ) ? (*str - '0' ) * 10 +atoi( ++str ): 0;
}

家里没有编译环境,不能调错,有错请包含

[ 本帖最后由 blackuhlan 于 2007-2-3 23:56 编辑 ]


 feiyang21687 回复于:2007-02-04 11:20:53

第一个:

void swap(int &a, int &b)
{
    a = a XOR b;
    b = a XOR b;
    a = a XOR b;
}

其中XOR表示异或。

[ 本帖最后由 feiyang21687 于 2007-2-4 11:22 编辑 ]


 cobras 回复于:2007-02-04 11:54:51

不知如下atoi的是否满足要求

#include <stdio.h>

int atoi(const char *s, int *ret){
const char *p;
if(s==NULL||ret==NULL)return-1;
for(; *s!='\0'; s++)if(*s==' ')continue;else if(*s>='0'&&*s<='9'||*s=='-')break;else return-1;
for(p=*s=='-'?s+1:s,*ret=0; *p!='\0'; p++)if(*p>='0'&&*p<='9')*ret=*ret*10+*p-'0';else if(*p==' ')break;else return-1;
if(*s=='-')*ret=-*ret;
return 0;
}

int main(void){
char str[]="   -100 "; /* 前后可加空格 */
int num;

if(atoi(str, &num)==0){
printf("%s == %d\n", str, num);
}
return 0;
}



 babyyellow 回复于:2007-02-09 16:08:28

引用:原帖由 blackuhlan 于 2007-2-3 23:54 发表
int atoi( char * str )
{
    return ( *str == 0)? atoi(++str)/10:(*str == '-' )? -1*atoi( ++str ):(*str >= '0' && *str <= 9 ) ? (*str - '0' ) * 10 +atoi( ++str ): 0;
}

家里没有编 ... 






这个只能处理  "-123"  带'-'号的.
如果是"123"  或"ABC123" ,  "ABC" 

则返回0


 mynets 回复于:2007-02-10 00:47:16


#include <stdio.h>

int
myatoi(const char *str)
{
    int sum,sign;
    char vals[128] = {['0']=0,['1']=1,['2']=2,['3']=3,['4']=4,['5']=5,['6']=6,['7']=7,['8']=8,['9']=9};
    for (sum=0,sign=(str&&*str=='-')?(++str,-1):1;str&&(*str>='0'&&*str<='9');)
        sum=sum*10+vals[*str++];
    return sum*sign;
}

int
main()
{
    char buf[128];
    char *ptr;
    while (1) {
        printf("input:");
        fgets(buf,sizeof(buf),stdin);
        while (*(ptr=&buf[strlen(buf)-1])=='\n'&&ptr>=buf)
            *ptr--=0;
        if (strcmp(buf, "q") == 0)
            break;
        printf("%d\n", myatoi(buf));
    }
    return 0;
}



引用:
input:123
123
input:09
9
input:-23
-23
input:1a
1
input:a1
0
input:aaa
0
input:001
1
input:-a1
0
input:-1a
-1
input:-01a
-1




 ivanpank 回复于:2007-02-12 17:40:54

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;

int
exchange(int a, int b, int c)
{
    a = a + b + c;
    c = a - b - c;
    b = a - b - c;
    a = a - b - c;
}
都很精彩,见过第一个,没想到第二个,厉害厉害


 Sorehead 回复于:2007-02-13 11:42:08

int strtoint(const char *str)
{
        int a = 0, b;

        b = '-' == *str ? str++, 1 : ('+' == *str ? str++, 0 : 0);
        while (('0' <= *str && '9' >= *str))
                a = a * 10 + *(str++) - '0';
        a = b ? 0 - a : a;

        return a;
}


和库函数aoti返回值一样


 arthasg 回复于:2007-02-23 00:11:05

c = (a+c)-(a=b,b=c); 
报错的是不是跟编译器,有关?也就是说,不能移植?


 jemy.zhang 回复于:2007-02-23 15:32:08

第二题5句话包括出错处理,个人觉得完全是胡搅蛮缠,代码写的好不在于长短,而且一个一个看过来,都是在合并代码,把很多行写在一行上,晦涩难懂,可读性非常差


 nan121 回复于:2007-06-07 11:33:26

没人讨论了? 

支持加加减减的同学,请考虑一下溢出风险 比如16位机器中 令: a = 65534 , b = 2, c = -65535

认为a ^= b ^= c ^= a ^= b ^= c ^= a ^= b难懂的同学,请重复阅读一边赋值语句的运算顺序


 wangruihit 回复于:2007-06-07 16:49:52

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;


 wangruihit 回复于:2007-06-07 16:50:55

谁能解释一下那条语句?不胜感激!
a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;


 antigloss 回复于:2007-06-07 19:49:29

引用:原帖由 nan121 于 2007-6-7 11:33 发表
没人讨论了? 

支持加加减减的同学,请考虑一下溢出风险 比如16位机器中 令: a = 65534 , b = 2, c = -65535

认为a ^= b ^= c ^= a ^= b ^= c ^= a ^= b难懂的同学,请重复阅读一边赋值语句的运算顺序 


请这位同学先认真看一下副作用(side effect)和序列点(sequence point)的概念,以及表达式中 evaluation 的概念,然后重新评价一下这个方法。


 mokai 回复于:2007-06-08 17:25:14

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;  

这个才是对的呢,题目中并没有给指定数字,所以相对于double型的等,还有溢出问题。。


 openq 回复于:2007-06-12 19:04:29

a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;思想很精辟但不好理解也很难推广,如果能写成以下函数
void swap(int &a,int &b){
a^=b;
b^=a;
a^=b;
}
然后在main()函数中调用两次swap()函数;就不难理解了,清晰易懂而且可以推广到3个以上的情况!


 sltk 回复于:2007-06-12 22:21:57

第二题应该使用递归而不是循环,这样才能减少程序行数
然而递归却是经常使用命令式语言的人的死穴
本题的考察目的可能就在于此

[ 本帖最后由 sltk 于 2007-6-12 22:23 编辑 ]


 hcq0411 回复于:2007-06-13 13:48:27

[CODE]
#include<math.h>
#include<stdlib.h>
#include<stdio.h>

int p(char *src)
{
int cnt=(int)pow(10, (strlen(src)-1));
if(*(src+1)=='\0')
return *src-'0';
return (*src - '0')*cnt + p(src+1);
}
int main(void)
{
char a[]="1234";
printf("%d", p(a));
return 0;
}
[/CODE]
递归不太好实现啊。也没少几行代码,还没加入测试功能,还调用了两个库函数。
兄弟们还有好的递归方案不?


 tena 回复于:2007-06-13 14:09:38

个人觉得,
写程序,最好还是用常规的思路来写,特别是效率差别不大的时候,
好维护。

更不要去和编译器较劲,通用一点的好。
有力气,还是多花在用户需求、扩展性、可维护性方面好一些。

不要走火入魔了


 hongtianyu 回复于:2007-06-29 10:26:53

1.(1)用位运算.用位运算时,必须判断数是否存在相等情况,此外,对于浮点数,位运算就不行.
  
  (2)
void swap(int *a,int *b,int *c)
{
    *a = *a + *b + *c;
    *c = *a - *b - *c;
    *b = *a - *b - *c;
    *a = *a - *b - *c;
}
这样方法对浮点数可行,但存在溢出问题,当*a,*b,*c数比较大时,它们的和就可能溢出了.
 以上两种方法,视情况而用吧


 yunzhongxuan 回复于:2007-06-29 16:49:18

(2)


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


long fun(char *in) {
char out[257];
memset(out, '\0', sizeof(out));
    sprintf(out, "%0*ld", strlen(in), atol(in));
    if(strcmp(in, out) != 0) {
//    printf("**********error************\n");
    return -1;
    } else {
    return atol(in);
    }
}


main()
{
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("-12345"));
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("0000"));
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("000125"));
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("sfdg12"));
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("1234gh"));
printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("654"));

}




测试结果:
$$$$$$$$$$$ -12345 $$$$$$$$$$$$
$$$$$$$$$$$ 0 $$$$$$$$$$$$
$$$$$$$$$$$ 125 $$$$$$$$$$$$
$$$$$$$$$$$ -1 $$$$$$$$$$$$
$$$$$$$$$$$ -1 $$$$$$$$$$$$
$$$$$$$$$$$ 654 $$$$$$$$$$$$




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=883665
转载请注明作者名及原文出处



收藏本页到:      

收藏本页到: