字符串比较、搜寻


若要进行字符串的比较,可以使用strcmpstrncmp

int strcmp( const char *lhs, const char *rhs );
int strncmp( const char *lhs, const char *rhs, size_t count );

strcmp(str1, str2)会比较字符串str1str2的大小,若相同就返回 0,str1大于str2则返回大于 0 的值,小於则返回小于 0 的值,比较的标准是依字典顺序,例如若str1大于str2,表示str1在字典中的顺序是在str2之后。

strncmp是比较两个字符串中指定长度内的字符是否相同,一个字符串比较范例如下所示:

#include <stdio.h>
#include <string.h>
#define LEN 80

int main(void) {
    char passwd[] = "123456";
    char buf[LEN];

    printf("请输入密码:");
    fgets(buf, LEN, stdin);

    if(strncmp(passwd, buf, 6) == 0) {
        puts("密码正确");
    }
    else {
        puts("密码错误");
    }

    return 0;
}

执行结果:

请输入密码:123456
密码正确

C 标准函数库也提供了搜寻字符串的相关函数,先来看到strstr函数:

char *strstr( const char* str, const char* substr );

第一个参数是被搜寻字符串,第二个参数是想要搜寻的子字符串,如果没找到子字符串则返回NULL,如果搜寻到第一个符合的子字符串,则返回符合位置的指针,若想要得知子字符串是在哪一个索引位置,则可以利用该指针减去字符串(字符数组)开头的指针,得到的位移量即为符合的索引位置,一个范例如下所示:

#include <stdio.h>
#include <string.h>
#define LEN 80

int main(void) {
    char source[LEN];
    char search[LEN];

    printf("输入字符串:");
    fgets(source, LEN, stdin);

    printf("搜寻子字符串:");
    fgets(search, LEN, stdin);

    // 去除最后的换行字符
    search[strlen(search) - 1] = '\0';

    char *loc = strstr(source, search);

    if(loc == NULL) {
        printf("找不到符合的子字符串\n");
    }
    else {
        printf("在索引位置 %lu 处找到子字符串\n", loc - source);
    }

    return 0;
}

执行结果:

输入字符串:How do you do?
搜寻子字符串:you
在索引位置 7 处找到子字符串

相对于strstr函数找出符合的子字符串,strspn函数则用来比较两个字符串,找出两个字符串中开始不匹配的地方:

size_t strspn( const char *dest, const char *src );

strspn会返回两个字符串开始不匹配的第一个字符索引位置,否则返回 0,一个使用范例如下:

#include <stdio.h>
#include <string.h>
#define LEN 80

int main(void) {
    char str1[LEN];
    char str2[LEN];

    printf("输入字符串:");
    fgets(str1, LEN, stdin);

    printf("搜寻子字符串:");
    fgets(str2, LEN, stdin);
    // 去除最后的换行字符
    str2[strlen(str2) - 1] = '\0';

    size_t loc = strspn(str1, str2);

    if(loc == strlen(str1)) {
        printf("完全匹配\n");
    }
    else {
        printf("从索引位置 %lu 处开始不匹配\n", loc);
    }

    return 0;
}

执行结果:

输入字符串:How do you do?
搜寻子字符串:How do joe do?
从索引位置 7 处开始不匹配

以上都是直接搜寻字符串中的子字符串,以下介绍的是搜寻字符串中的字符。

strchr函数找出字符串中的指定字符第一次出现,若找到则返回该字符的指针,否则返回NULL,可以用找到的指针位置减去字符串(字符数组)开头地址,如此就可以得到其于字符串中的索引位置,而strrchr则是与strchr类似,只不过它是反向搜寻:

char *strchr( const char *str, int ch );
char *strrchr( const char *str, int ch );

strcspn函数则是找出一个字符串中与另一个字符串任何字符第一次匹配的索引位置,若无则返回字符串长度:

size_t strcspn( const char *dest, const char *src );

直接写个范例示范strcspn函数之使用:

#include <stdio.h>
#include <string.h>
#define LEN 80

int main(void) {
    char str1[LEN];
    char str2[LEN];

    printf("输入字符串:");
    fgets(str1, LEN, stdin);

    printf("搜寻子字符串:");
    fgets(str2, LEN, stdin);
    // 去除最后的换行字符
    str2[strlen(str2) - 1] = '\0';

    size_t loc = strcspn(str1, str2);

    if(loc == strlen(str1)) {
        printf("没有任何字符匹配\n");
    }
    else {
        printf("索引位置 %lu 处匹配到字符\n", loc);
    }

    return 0;
}

执行结果:

输入字符串:How do you do?
搜寻子字符串:wo
索引位置 1 处匹配到字符

strpbrk函数则与strcspn类似,只不过完全不匹配的话,则返回NULL

char* strpbrk( const char* dest, const char* breakset );




展开阅读全文