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