刘涛涛题目,无聊写了下

来源:互联网 发布:软件体系结构 组成 编辑:程序博客网 时间:2024/04/29 07:36

// 刘涛涛题目
// 有一个字符串,里面包含一些数字,写一个函数, 把这些数字加起来。
// 比如“我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;
}

 
原创粉丝点击