久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2626|回復(fù): 1
收起左側(cè)

專題二:1、C語言字符處理獲取指定字符串

[復(fù)制鏈接]
ID:591424 發(fā)表于 2022-3-10 13:16 | 顯示全部樓層 |閱讀模式
在對 C 語言的編程實(shí)踐中,字符串查找是最頻繁的字符串操作之一,本節(jié)就對常用的字符串查找函數(shù)做一個(gè)簡單的總結(jié)。
使用 strchr 與 strrchr 函數(shù)查找單個(gè)字符如果需要對字符串中的單個(gè)字符進(jìn)行查找,那么應(yīng)該使用 strchr 或 strrchr 函數(shù)。其中,strchr 函數(shù)原型的一般格式如下:
char *strchr(const char *s, int c);
它表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出現(xiàn)的位置,如果未找到字符 c,則返回 NULL。也就是說,strchr 函數(shù)在字符串 s 中從前到后(或者稱為從左到右)查找字符 c,找到字符 c 第一次出現(xiàn)的位置就返回,返回值指向這個(gè)位置,如果找不到字符 c 就返回 NULL。

相對于 strchr 函數(shù),strrchr 函數(shù)原型的一般格式如下:
char *strrchr(const char *s, int c);
與 strchr 函數(shù)一樣,它同樣表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出現(xiàn)的位置,如果未找到字符 c,則返回 NULL。但兩者唯一不同的是,strrchr 函數(shù)在字符串 s 中是從后到前(或者稱為從右向左)查找字符 c,找到字符 c 第一次出現(xiàn)的位置就返回,返回值指向這個(gè)位置。下面的示例代碼演示了兩者之間的區(qū)別:

    int main(void)
    {
        char str[] = "I welcome any ideas from readers, of course.";
        char *lc = strchr(str, 'o');
        printf("strchr: %s\n", lc);
        char *rc = strrchr(str, 'o');
        printf("strrchr: %s\n", rc);
        return 0;
    }



對于上面的示例代碼,strchr 函數(shù)是按照從前到后的順序進(jìn)行查找,所以得到的結(jié)果為“ome any ideas from readers,of course.”; 而 strrchr 函數(shù)則相反,它按照從后到前的順序進(jìn)行查找,所以得到的結(jié)果為“ourse.”。

示例代碼運(yùn)行結(jié)果為:
strchr: ome any ideas from readers, of course.
strrchr: ourse.

最后還需要注意的是,為什么函數(shù)的“c”參數(shù)是 int 類型,而不是“char”類型呢?

其實(shí)原因很簡單,這里用的是字符的 ASCII 碼(因?yàn)槊總(gè)字符都對應(yīng)著一個(gè) ASCII 碼),這樣在傳值的時(shí)候既可以傳“char”類型的值,又可以傳“int”類型的值(0~127)。
使用 strpbrk 函數(shù)查找多個(gè)字符上面的 strchr 與 strrchr 函數(shù)解決了對字符串中單個(gè)字符的查找,那么需要查找多個(gè)字符時(shí)怎么辦呢?

如果要查找多個(gè)字符,就需要使用 strpbrk 函數(shù)了。該函數(shù)在源字符串(s1)中按從前到后順序找出最先含有搜索字符串(s2)中任一字符的位置并返回,空字符 null('\0') 不包括在內(nèi),若找不到則返回空指針。其函數(shù)原型的一般格式如下:
char *strpbrk(const char *s1,const char *s2);
例如,在 strpbrk 函數(shù)的定義如下:

    char *strpbrk (const char *s, const char *accept)
    {
        while (*s != '\0')
        {
            const char *a = accept;
            while (*a != '\0')
                if (*a++ == *s)
                    return (char *) s;
            ++s;
        }
        return NULL;
    }



如上面的代碼所示,strpbrk 數(shù)首先依次循環(huán)檢查字符串 s 中的字符,當(dāng)被檢驗(yàn)的字符在字符串 accept 中也包含時(shí)(即“if(*a++==*s)”),則停止檢驗(yàn),并返回“(char*)s”。如果沒有匹配字符,則返回空指針 NULL。這里需要注意的是,空字符 null('\0')不包括在內(nèi)。函數(shù)的調(diào)用示例如下面的代碼所示:

    int main(void)
    {
        char str[] = "I welcome any ideas from readers, of course.";
        char *rc=strpbrk(str,"come");
        printf("%s\n",rc);
        return 0;
    }



很顯然,示例代碼的運(yùn)行結(jié)果為“elcome any ideas from readers,of course.”。
使用 strstr 函數(shù)查找一個(gè)子串相對于 strpbrk 函數(shù),strstr 函數(shù)表示在字符串 haystack 中從前到后查找子串 needle 第一次出現(xiàn)的位置(不比較結(jié)束符 null('\0')),并返回指向第一次出現(xiàn) needle 位置的指針,如果沒找到則返回 NULL。其函數(shù)原型的一般格式如下:
char *strstr(const char *haystack, const char *needle);
strstr 函數(shù)的調(diào)用示例如下面的代碼所示:

    int main(void)
    {
        char str[] = "I welcome any ideas from readers, of course.";
        char *c1=strstr(str, "come");
        printf("come:%s\n",c1);
        char *c2=strstr(str, "icome");
        printf("icome:%s\n",c2);
        return 0;
    }



這里需要注意的是,因?yàn)?strstr 函數(shù)與 strpbrk 函數(shù)不同,strstr 函數(shù)匹配的是字符串,所以語句“strstr(str,"icome")”將返回 NULL。運(yùn)行結(jié)果為:
come:come any ideas from readers, of course.
icome:(null)
區(qū)別 strspn 與 strcspn 函數(shù)strspn 函數(shù)表示從字符串 s 的第一個(gè)字符開始,逐個(gè)檢查字符與字符串 accept 中的字符是否不相同,如果不相同,則停止檢查,并返回以字符串 s 開頭連續(xù)包含字符串 accept 內(nèi)的字符數(shù)目。其函數(shù)原型的一般格式如下:
size_t strspn(const char *s, const char *accept);
例如,該函數(shù)的定義如下:

    size_t strspn (const char *s,const char *accept)
    {
        const char *p;
        const char *a;
        size_t count = 0;
        for (p = s; *p != '\0'; ++p)
        {
            for (a = accept; *a != '\0'; ++a)
                if (*p == *a)
                    break;
                if (*a == '\0')
                    return count;
                else
                    ++count;
        }
        return count;
    }



從上面的示例代碼中可以看出,strspn 函數(shù)從字符串參數(shù) s 的開頭計(jì)算連續(xù)的字符,而這些字符完全是 accept 所指字符串中的字符。簡單地說,如果 strspn 函數(shù)返回的數(shù)值為 n,則代表字符串 s 開頭連續(xù)有 n 個(gè)字符都屬于字符串 accept 內(nèi)的字符。

函數(shù)的調(diào)用示例如下面的代碼所示:

    int main(void)
    {
        char str[] = "I welcome any ideas from readers, of course.";
        printf("I wel:%d\n",strspn(str,"I wel"));
        printf("Iwel:%d\n",strspn(str,"Iwel"));
        printf("welcome:%d\n",strspn(str,"welcome"));
        printf("5:%d\n",strspn(str,"5"));
        return 0;
    }



在上面的示例代碼中,因?yàn)?strspn 函數(shù)返回的是以字符串 s 開頭連續(xù)包含字符串 accept 內(nèi)的字符數(shù)目。而源字符串 str 中的“I”與“welcome”之間有一個(gè)空格(即“I welcome”),所以,語句“strspn(str,"Iwel")”將返回 1,而語句“strspn(str,"I wel")”將返回 5。因此,輸出結(jié)果為:
I wel:5
Iwel:1
welcome:0
5:0

相對于 strspn 函數(shù),strcspn 函數(shù)與之相反,它表示從字符串 s 第一個(gè)字符開始,逐個(gè)檢查字符與 reject 中的字符是否相同,如果相同,則停止檢查,并返回以字符串 s 開頭連續(xù)不含字符串 reject 內(nèi)的字符數(shù)目。其函數(shù)原型的一般格式如下:
size_t strcspn(const char *s, const char *reject);
該函數(shù)的定義如下:

    size_t strcspn (const char *s,const char *reject)
    {
        size_t count = 0;
        while (*s != '\0')
            if (strchr (reject, *s++) == NULL)
                ++count;
            else
                return count;
        return count;
    }



從上面的代碼中不難發(fā)現(xiàn),strcspn 函數(shù)正好與 strspn 函數(shù)相反。strcspn 函數(shù)從字符串參數(shù) s 的開頭計(jì)算連續(xù)的字符,而這些字符都完全不在參數(shù) reject 所指的字符串中。簡單地說,如果 strcspn 函數(shù)返回的數(shù)值為 n,則代表字符串 s 開頭連續(xù)有 n 個(gè)字符都不包含字符串 reject 內(nèi)的字符。

函數(shù)的調(diào)用示例如下面的代碼所示:

    int main(void)
    {
        char str[] = "I welcome any ideas from readers, of course.";
        printf("I wel:%d\n",strcspn(str,"I wel"));
        printf("Iwel:%d\n",strcspn(str,"Iwel"));
        printf("welcome:%d\n",strcspn(str,"welcome"));
        printf("5:%d\n",strcspn(str,"5"));
        return 0;
    }



在上面的示例代碼中,因?yàn)?strcspn 函數(shù)返回的是以字符串 s 開頭連續(xù)不包含字符串 accept 內(nèi)的字符數(shù)目。因此,其運(yùn)行結(jié)果為:
I wel:0
Iwel:0
welcome:2
5:45

由此可見,對于 strspn 函數(shù),如果找到了 reject 與 s 不相同元素時(shí),指針停止移動(dòng),并返回以字符串 s 開頭連續(xù)包含字符串 accept 內(nèi)的字符數(shù)目;而 strncspn 函數(shù)則是找到了 reject 與 s 相同元素時(shí),指針停止移動(dòng),并返回以字符串 s 開頭連續(xù)不包含字符串 accept 內(nèi)的字符數(shù)目。這一點(diǎn)一定要注意,千萬不要混淆了。
回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2022-3-18 03:42 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91电影在线播放 | 国产ts人妖系列高潮 | 91精品国产综合久久福利软件 | a级片在线观看 | 欧美成人激情 | 久久久久久久久久久一区二区 | 国产免费一区二区三区 | 俺去俺来也www色官网cms | 91直接看| 亚洲男人网 | 日韩欧美一区二区三区免费观看 | www.久久精品 | 久久久www成人免费无遮挡大片 | 精品真实国产乱文在线 | 男女羞羞视频免费看 | 91黄在线观看| 久在线| 91免费在线视频 | 国产精品久久久久久久久久久免费看 | 激情综合五月天 | 精品日韩一区二区三区 | www.国产精 | 欧美一级二级在线观看 | 粉嫩av | av黄色在线观看 | 久久久久久久久综合 | 特黄色一级毛片 | 欧美日韩国产在线 | 日日操夜夜摸 | 天天色图| 免费看淫片 | 日韩成人影院在线观看 | 日韩欧美在线视频一区 | 久久精品亚洲国产奇米99 | 日韩一区二区三区视频 | 亚洲h在线观看 | 免费看a | 成人午夜免费在线视频 | 欧美区在线 | 欧美在线视频二区 | 亚洲av一级毛片 |