// 刘涛涛题目 // 有一个字符串,里面包含一些数字,写一个函数, 把这些数字加起来。 // 比如“我30你40他50”结果就是120。 给弟弟写的,丢这给你看
/**/
//
//
//
刘涛涛题目
//
有一个字符串,里面包含一些数字,写一个函数, 把这些数字加起来。
//
比如“我30你40他50”结果就是120。
//
/**/
//
//
头文件
#include
<
stdio.h
>
/**/
//
//
全局变量
/**/
//
//
参数表
/**/
//
//
入口点
int
main(
int
argc,
char
*
argv[])
...
{ char * cPtr = NULL, * cIter = NULL; char * buf; int len,i,sum = 0 ; if (argc < 2 ) ... { printf( " [+] Usage: %s {#input string} " " [-] Example: %s 我30你40他50 " " [-] ---->Result: 120 " , argv[ 0 ],argv[ 0 ]); exit( 1 ); } // 复制字符串 len = strlen(argv[ 1 ]); buf = ( char * )malloc(len + 1 ); strcpy(buf,argv[ 1 ]); printf( " input string length = %d " ,len); printf( " input string is: %s " ,argv[ 1 ]); printf( " copyed string is: %s " ,buf); // 截断字符串,将其变为多个字符串,计算每个数字字串 for (i = 0 ;i < len;i ++ ) ... { if (buf[i] >= ' 0 ' && buf[i] <= ' 9 ' ) // 字符为数字 ... { cPtr = buf + i; cIter = cPtr + 1 ; while ( * cIter >= ' 0 ' && * cIter <= ' 9 ' ) // 寻找数字字符串 ... { cIter ++ ; i ++ ; } * cIter = '/0';
sum += atoi(cPtr); printf("i = %d/tcurrent string: %s/tsum = %6d/n",i,cPtr,sum); } } printf("---->Result: %d/n",sum); free(buf); return 0; } //
在看雪发了后,dwing给了一个代码,思路一样,都是截断字符串计算,但是实现看起来清爽很多:)
他的问题:
1。实现时有错误,看了下atoi的实现,如果输入字符中有两个--相连的时候,atoi会跳过该数字,如 "aker--9=10"只会计算10
2。另外感觉dwing每次调用atoi还是有些不好,稍微改了下,主要是加了个判断,这样就会少调用很多次atoi了。
#include
<
stdio.h
>
#include
<
stdlib.h
>
int
mysum(
const
char
*
str)
...
{ int s = 0 ; do ... { if ( * str >= ' 0 ' && * str <= ' 9 ' ) ... { // 如果是数字则试图计算 printf( " sum = %6d current string: %s " ,s,str); s += atoi(str); while ( * str >= ' 0 ' && * str <= ' 9 ' ) ++ str; // 该数字串已计算,跳过数字 } }while ( * str ++ ); return s; }
void
main(
int
argc,
char
**
argv)
...
{ if (argc == 2 ) printf( " %d " ,mysum(argv[ 1 ])); }
2007-07-07 看了贴子,Roba的比较简单
2007-06-16, 17:08 Roba写道,atoi()不是ANSI标准,要尽量避免使用,比方说在GCC里就是编译不过的。想要转化的话也可以用sscanf()。
写个不用库函数的:
int
calc(
char
*
buf)
...
{ int i, s, ans; for (i = s = ans = 0 ; buf[i] ; i ++ ) ... { if (buf[i] >= ' 0 ' && buf[i] <= ' 9 ' ) s = s * 10 + buf[i] - ' 0 ' ; else ... {ans += s; s = 0 ;} } return ans + s; }