打印
[经验分享]

C语言字符处理获取指定字符串

[复制链接]
1703|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yorkbarney|  楼主 | 2024-2-20 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结。
使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行查找,那么应该使用 strchr 或 strrchr 函数。其中,strchr 函数原型的一般格式如下:
char *strchr(const char *s, int c);
它表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。也就是说,strchr 函数在字符串 s 中从前到后(或者称为从左到右)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位置,如果找不到字符 c 就返回 NULL。

相对于 strchr 函数,strrchr 函数原型的一般格式如下:
char *strrchr(const char *s, int c);
与 strchr 函数一样,它同样表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。但两者唯一不同的是,strrchr 函数在字符串 s 中是从后到前(或者称为从右向左)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位置。下面的示例代码演示了两者之间的区别:

    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 函数是按照从前到后的顺序进行查找,所以得到的结果为“ome any ideas from readers,of course.”; 而 strrchr 函数则相反,它按照从后到前的顺序进行查找,所以得到的结果为“ourse.”。

示例代码运行结果为:
strchr: ome any ideas from readers, of course.
strrchr: ourse.

最后还需要注意的是,为什么函数的“c”参数是 int 类型,而不是“char”类型呢?

其实原因很简单,这里用的是字符的 ASCII 码(因为每个字符都对应着一个 ASCII 码),这样在传值的时候既可以传“char”类型的值,又可以传“int”类型的值(0~127)。
使用 strpbrk 函数查找多个字符上面的 strchr 与 strrchr 函数解决了对字符串中单个字符的查找,那么需要查找多个字符时怎么办呢?

如果要查找多个字符,就需要使用 strpbrk 函数了。该函数在源字符串(s1)中按从前到后顺序找出最先含有搜索字符串(s2)中任一字符的位置并返回,空字符 null('\0') 不包括在内,若找不到则返回空指针。其函数原型的一般格式如下:
char *strpbrk(const char *s1,const char *s2);
例如,在 strpbrk 函数的定义如下:

    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 数首先依次循环检查字符串 s 中的字符,当被检验的字符在字符串 accept 中也包含时(即“if(*a++==*s)”),则停止检验,并返回“(char*)s”。如果没有匹配字符,则返回空指针 NULL。这里需要注意的是,空字符 null('\0')不包括在内。函数的调用示例如下面的代码所示:

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



很显然,示例代码的运行结果为“elcome any ideas from readers,of course.”。
使用 strstr 函数查找一个子串相对于 strpbrk 函数,strstr 函数表示在字符串 haystack 中从前到后查找子串 needle 第一次出现的位置(不比较结束符 null('\0')),并返回指向第一次出现 needle 位置的指针,如果没找到则返回 NULL。其函数原型的一般格式如下:
char *strstr(const char *haystack, const char *needle);
strstr 函数的调用示例如下面的代码所示:

    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;
    }



这里需要注意的是,因为 strstr 函数与 strpbrk 函数不同,strstr 函数匹配的是字符串,所以语句“strstr(str,"icome")”将返回 NULL。运行结果为:
come:come any ideas from readers, of course.
icome:(null)
区别 strspn 与 strcspn 函数strspn 函数表示从字符串 s 的第一个字符开始,逐个检查字符与字符串 accept 中的字符是否不相同,如果不相同,则停止检查,并返回以字符串 s 开头连续包含字符串 accept 内的字符数目。其函数原型的一般格式如下:
size_t strspn(const char *s, const char *accept);
例如,该函数的定义如下:

    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 函数从字符串参数 s 的开头计算连续的字符,而这些字符完全是 accept 所指字符串中的字符。简单地说,如果 strspn 函数返回的数值为 n,则代表字符串 s 开头连续有 n 个字符都属于字符串 accept 内的字符。

函数的调用示例如下面的代码所示:

    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;
    }



在上面的示例代码中,因为 strspn 函数返回的是以字符串 s 开头连续包含字符串 accept 内的字符数目。而源字符串 str 中的“I”与“welcome”之间有一个空格(即“I welcome”),所以,语句“strspn(str,"Iwel")”将返回 1,而语句“strspn(str,"I wel")”将返回 5。因此,输出结果为:
I wel:5
Iwel:1
welcome:0
5:0

相对于 strspn 函数,strcspn 函数与之相反,它表示从字符串 s 第一个字符开始,逐个检查字符与 reject 中的字符是否相同,如果相同,则停止检查,并返回以字符串 s 开头连续不含字符串 reject 内的字符数目。其函数原型的一般格式如下:
size_t strcspn(const char *s, const char *reject);
该函数的定义如下:

    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;
    }



从上面的代码中不难发现,strcspn 函数正好与 strspn 函数相反。strcspn 函数从字符串参数 s 的开头计算连续的字符,而这些字符都完全不在参数 reject 所指的字符串中。简单地说,如果 strcspn 函数返回的数值为 n,则代表字符串 s 开头连续有 n 个字符都不包含字符串 reject 内的字符。

函数的调用示例如下面的代码所示:

    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;
    }



在上面的示例代码中,因为 strcspn 函数返回的是以字符串 s 开头连续不包含字符串 accept 内的字符数目。因此,其运行结果为:
I wel:0
Iwel:0
welcome:2
5:45

由此可见,对于 strspn 函数,如果找到了 reject 与 s 不相同元素时,指针停止移动,并返回以字符串 s 开头连续包含字符串 accept 内的字符数目;而 strncspn 函数则是找到了 reject 与 s 相同元素时,指针停止移动,并返回以字符串 s 开头连续不包含字符串 accept 内的字符数目。这一点一定要注意,千万不要混淆了。

使用特权

评论回复
沙发
lzbf| | 2024-3-4 12:27 | 只看该作者
在C语言中,你可以使用strstr()函数来在一个字符串中查找另一个字符串的位置。strstr()函数是标准库函数,它包含在string.h头文件中。这个函数会返回指向第一次出现指定子字符串的指针,如果没有找到则返回NULL。

使用特权

评论回复
板凳
gygp| | 2024-3-4 12:40 | 只看该作者
strncpy()不会自动在目标字符串末尾添加空字符\0,除非源字符串的长度小于指定的字符数

使用特权

评论回复
地板
albertaabbot| | 2024-3-5 14:03 | 只看该作者
#include<stdio.h>
#include<string.h>

int main() {
    char str[] = "Hello, I am a C language programmer.";
    char target[] = "C language";

    // 使用strstr函数查找指定字符串
    char *result = strstr(str, target);

    if (result != NULL) {
        printf("找到指定字符串: %s\n", result);
    } else {
        printf("未找到指定字符串\n");
    }

    return 0;
}

使用特权

评论回复
5
loutin| | 2024-3-7 13:39 | 只看该作者
如果你想从一个字符串中提取出特定的子字符串,你可以使用标准库中的strstr函数

使用特权

评论回复
6
sesefadou| | 2024-3-11 18:29 | 只看该作者
获取字符串中的指定部分或者查找特定字符在字符串中的位置

使用特权

评论回复
7
minzisc| | 2024-3-12 14:49 | 只看该作者
可以使用两个指针,一个指向原始字符串的开始,另一个指向要提取的字符串的开始。

使用特权

评论回复
8
sesefadou| | 2024-3-14 12:04 | 只看该作者
要在C语言中获取指定字符串,可以使用strncpy()函数。该函数用于将源字符串的前n个字符复制到目标字符串中。

使用特权

评论回复
9
rosemoore| | 2024-3-14 14:53 | 只看该作者
strstr函数会在str中查找substr第一次出现的位置,并返回一个指向该位置的指针。如果找不到substr,strstr会返回NULL。

使用特权

评论回复
10
adolphcocker| | 2024-3-14 19:04 | 只看该作者
可以使用strcpy函数将一个字符串复制到另一个字符串中。

使用特权

评论回复
11
tabmone| | 2024-3-15 14:45 | 只看该作者
可以使用strncpy()函数,这个函数会复制指定长度的字符从源字符串到目标字符串。

使用特权

评论回复
12
juliestephen| | 2024-3-16 14:25 | 只看该作者
在C语言中,可以使用多种方法来处理字符串。

使用特权

评论回复
13
abotomson| | 2024-3-17 11:01 | 只看该作者
在字符串str中查找第一个出现的字符ch,并返回指向该字符的指针。如果没有找到该字符,则返回NULL。

使用特权

评论回复
14
primojones| | 2024-3-17 22:36 | 只看该作者
#include <string.h>
char dst[SIZE]; // SIZE应该足够容纳目标字符串
char src[] = "This is a test string.";
size_t start_index = 5; // 开始位置
size_t length = 7; // 要截取的字符数

strncpy(dst, src + start_index, length); // 注意添加'\0'确保dst是一个完整的字符串
dst[length] = '\0'; // 结束符补充,防止越界读取

puts(dst); // 输出截取的子串

使用特权

评论回复
15
phoenixwhite| | 2024-3-20 18:03 | 只看该作者
#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char str[100] = "Hello, this is a test string.";  
    char *target = "test";  
    char *result;  
  
    // 使用strstr()查找子字符串  
    result = strstr(str, target);  
  
    if (result != NULL) {  
        // 输出子字符串在原字符串中的位置  
        printf("Found '%s' in '%s' at position: %ld\n", target, str, result - str);  
    } else {  
        // 如果没有找到子字符串,输出相应的信息  
        printf("'%s' not found in '%s'\n", target, str);  
    }  
  
    return 0;  
}

使用特权

评论回复
16
linfelix| | 2024-3-24 14:52 | 只看该作者
虽然C语言的标准库并没有直接提供字符串截取功能,但可以通过组合strncpy()、strtok()等函数实现。如果需要更灵活的字符串截取,可以编写自定义函数。例如,如果你知道要提取子串的开始和结束索引,可以手动复制子串。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

1236

帖子

1

粉丝