// 刘涛涛题目
// 有一个字符串,里面包含一些数字,写一个函数, 把这些数字加起来。
// 比如“我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';
//
// 刘涛涛题目
// 有一个字符串,里面包含一些数字,写一个函数, 把这些数字加起来。
// 比如“我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;
}
//
printf("i = %d/tcurrent string: %s/tsum = %6d/n",i,cPtr,sum);
}
}
printf("---->Result: %d/n",sum);
free(buf);
return 0;
}
//
他的问题:
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]));
}
#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;
}
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;
}