用 scanf 系列函數實現簡單的 email 地址合法性檢查功能

對於 scanf 家族系列函數( scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf),相信大家對它們常見的格式化輸入已十分熟悉。 但是, scanf 系列函數,還有一個特殊的用法,該用法能夠實現簡單的字符過濾功能,類似正則表達式,您是否知道呢? scanf 函數還能實現正則表達式?讓我們往下看吧^_^

這個特殊的格式,就是“[ ]”,一對中括號,支持簡單的正則表達式功能,比如 "%[^a-z]" 將忽略所有的 a-z 的小寫字母; "%[A-Z]" 將只接收 A-Z 的大寫字母。學過正則表達式的同學,一看這個用法,就會覺得那麼的親切^_^。

scanf 家族函數(scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf)都支持這種特殊功能,雖然不如真正的正則表達式那麼強大,但是如果運用靈活,在驗證要求不高的場景下,這個特性還是能夠爲我們節省不少精力的,殺雞焉用牛刀!讓我們一睹該特性的強大之處吧!(從函數單一性考慮, scanf 家族函數的功能太過強大了,呵呵)

 下面我們以檢查電子郵箱地址的合法性爲例,進行說明,假設合法 Email 地址的用戶名和域名均是由數字、字母、中劃線、下劃線、圓點組成,其他字符均爲非法字符。

源碼如下:

 

/******************************************************************************
Copyright by Javacode007, All rights reserved!
Filename    : scanf_printf.c
Author      : Javacode007
Date        : 2012-8-22
Version     : 1.0
Description : scanf系列函數實現簡單正則表達式
******************************************************************************/
#include <stdio.h>
#include <string.h>

int isValidEmail(const char *pcEmailaddr)
{
    /* 假定用戶名和服務器域名的地址最大值不超過127個字符 */
    char user[128] = {0};
    char site[128] = {0};

    if(NULL == pcEmailaddr)
    {
        return 0;
    }
    
    /* 設定合法 Email 地址的用戶名和域名均是由數字、字母、中劃線、下劃線、圓點組成 */
    sscanf(pcEmailaddr, "%[0-9a-zA-Z-_.]%[@0-9a-zA-Z._]", user,site);
    //printf("user=%s, site=%s\r\n", user, site);

    if(0 < strlen(user) && 0 < strlen(site) && ((strlen(user) + strlen(site)) == strlen(pcEmailaddr)))
    {
        if('@' == site[0])
        {
            return 1;
        }
    }

    return 0;
}

int main()
{
    const char* pacEmailaddrs[] = {"[email protected]", "some_bodycsdn.net", "some_body#@csdn.net",\
                                "[email protected]", "[email protected]"};     
    int i = 0;
    int len = sizeof(pacEmailaddrs)/sizeof(*pacEmailaddrs);

    for(i = 0; i < len; i++)
    {
        printf("\"%s\" is %s Email.\r\n", pacEmailaddrs[i], isValidEmail(pacEmailaddrs[i])?"Valid":"Invalid");
    }

    return 0;
}
    
    




輸出結果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章