d098

輸入說明 :

每組測資有一行,內含多個單字,每個單字之間會以空格作分隔(每一行的前後都有可能有空格,且分隔單字的空格可能不只一個)。

輸出說明 :

請求出所有僅含數字的單字,並且加總後輸出。這些數字的總和不會超過2的16次方。

這題我用sscanf來做

sscanf使用的時機就是題目給的行數不定,每一行的個數你也不知道

因為行數不固定,所以while(gets(s)),只要有讀到東西就繼續做,但是要結束了怎麼辦

所以當*p=='\0'時,程式結束,表示那一行第一個就是'\0'

用sscanf要注意的,你要把你那一行字串陣列的名稱,給一個字元指標,不然直接操做陣列名稱是不合法的,詳細怎麼用可以看這篇

對每一個讀進來的字串分析它是不是純數字

是的話把它轉成數字存到c陣列裡面

最後把c陣列裡面的數字全部加起來

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1000];
    char *p;

    while(gets(s))
    {
        p=s;
        if(*p=='\0')
            break;

        int l;
        int i,j=0;
        int nflag,cflag=0,sum=0;

        char a[10000];
        int  c[10000];

        while(sscanf(p,"%s%n",&a,&l)==1&&strcmp(s,"\0")!=0)
        {    
            p+=l;

            nflag=1;

            for(i=0;a[i];i++)
            {
                if(a[i]<'0'||a[i]>'9')
                {
                    nflag=0;
                    break;
                }    
            }

            if(nflag)
            {    
                cflag=1;
                for(i=0;a[i];i++)
                {
                    sum+=(a[i]-'0');
                    sum*=10;
                }
                sum/=10;
                c[j]=sum;
                j++;
                sum=0;
            }
        }
        j--;
        if(cflag)
            for(;j>=0;j--)
                sum+=c[j];

        printf("%d\n",sum);    
    }

    return 0;
}