UNIX網路程式設計學習(12)--對兩個數求和的str_echo函式-以及sscanf的用法

pengfoo發表於2012-03-27

//tcpcliserv/str_echo08.c

#include	"unp.h"

void
str_echo(int sockfd)
{
    long arg1,arg2;
    ssize_t n;
    char    line[MAXLINE];//#define	MAXLINE		4096

    for( ; ;)
    {
        if( (n = Readline(sockfd,line,MAXLINE))==0)
            return;

        if( sscanf(line,"%ld%ld",&arg1,&arg2) == 2)
            snprintf(line,sizeof(line),"%ld\n",arg1+arg2);

        else
            snprintf(line,sizeof(line),"input error\n");
        n = strlen(line);
        Writen(sockfd,line,n);

    }
}

名稱:

sscanf() - 從一個字串中讀進與指定格式相符的資料.

函式原型:

int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

int scanf( const char *format [,argument]... );

說明:

sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源。
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}

注:

1、 * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此資料不讀入. (也就是不把此資料讀入引數中)

2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。

3、width表示讀取寬度。

4、{h | l | I64 | L}:引數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。

5、type :這就很多了,就是%s,%d之類。

6、特別的:%*[width] [{h | l | I64 | L}]type表示滿足該條件的被過濾掉,不會向目標引數中寫入值

支援集合操作:

     %[a-z] 表示匹配a到z中任意字元,貪婪性(儘可能多的匹配)

     %[aB'] 匹配a、B、'中一員,貪婪性

     %[^a] 匹配非a的任意字元,貪婪性

例子:

1. 常見用法。

    char buf[512] = {0};

    sscanf("123456 ","%s", buf);

printf("%s\n",buf);

結果為:123456

2. 取指定長度的字串。如在下例中,取最大長度為4位元組的字串。

    sscanf("123456 ","%4s", buf);

printf("%s\n",buf);

結果為:1234

3. 取到指定字元為止的字串。如在下例中,取遇到空格為止字串。

    sscanf("123456 abcdedf","%[^ ]", buf);

printf("%s\n",buf);

結果為:123456

4.  取僅包含指定字符集的字串。如在下例中,取僅包含1到9和小寫字母的字串。

    sscanf("123456abcdedfBCDEF","%[1-9a-z]", buf);

printf("%s\n",buf);

結果為:123456abcdedf

5.  取到指定字符集為止的字串。如在下例中,取遇到大寫字母為止的字串。

    sscanf("123456abcdedfBCDEF","%[^A-Z]", buf);

printf("%s\n",buf);

結果為:123456abcdedf

6、給定一個字串iios/12DDWDFF@122獲取 / @之間的字串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf

sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]", buf);

printf("%s\n",buf);

結果為:12DDWDFF

7、給定一個字串““hello, world”,僅保留world。(注意:“,”之後有一空格)

sscanf(“hello, world”,"%*s%s", buf);  

printf("%s\n",buf);

結果為:world

%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了

如果沒有空格則結果為NULL



 

相關文章