劉濤濤題目,無聊寫了下

// 劉濤濤題目
// 有一個字符串,裏面包含一些數字,寫一個函數, 把這些數字加起來。
// 比如“我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;
}

 
發佈了14 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章