字符串的处理以及相关知识整理

时间:2023-01-31 18:37:19

关于字符串操作的相关函数

  • 我们知道,在编写程序时,了解一定数量的函数,能让你节省不少时间。同时,理解c++或者c语言内部的函数原理也有助于我们进一步理解编程的思想。

    字符串的操作的基本函数:

  1. strcpy(p, p1) 复制字符串
  2. strncpy(p, p1, n) 复制指定长度字符串
  3. strcat(p, p1) 附加字符串
  4. strncat(p, p1, n) 附加指定长度字符串
  5. strlen(p) 取字符串长度
  6. strcmp(p, p1) 比较字符串
  7. strcasecmp忽略大小写比较字符串
  8. strncmp(p, p1, n) 比较指定长度字符串
  9. strchr(p, c) 在字符串中查找指定字符
  10. strrchr(p, c) 在字符串中反向查找
  11. strstr(p, p1) 查找字符串
  12. strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
  13. strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移
  14. strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移

字符的检查

  1. isalpha() 检查是否为字母字符
  2. isupper() 检查是否为大写字母字符
  3. islower() 检查是否为小写字母字符
  4. isdigit() 检查是否为数字
  5. isxdigit() 检查是否为十六进制数字表示的有效字符
  6. isspace() 检查是否为空格类型字符
  7. iscntrl() 检查是否为控制字符
  8. ispunct() 检查是否为标点符号
  9. isalnum() 检查是否为字母和数字
  10. isprint() 检查是否是可打印字符
  11. isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct()

字符串操作相关的函数的具体实现以及算法分析

  1. 函数名: strcat
    功 能: 字符串拼接函数
    用 法: char strcat(char dest, const char *src);
    返回值: 返回dest字符串起始地址
    说 明: strcat() 会将参数src字符串复制到参数dest所指的字符串尾部;
    dest最后的结束字符'\0'会被覆盖掉,并在连接后的字符串的尾部再增加一个'\0';
    dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串;
    程序例:
#include <string.h>
#include <stdio.h>

int main(void)
{
   char destination[25];
   char *blank = " ", *c = "C++", *Borland = "Borland";

   strcpy(destination, Borland);
   strcat(destination, blank);
   strcat(destination, c);

   printf("%s\n", destination);  // 输出:Borland C++
   return 0;
}
  1. 函数名: strchr
    功 能: 在一个字符串中查找给定字符的第一个匹配之处
    用 法: char strchr(const char str, int c);
    返回值: 如果找到指定的字符则返回该字符所在地址,否则返回NULL
    说 明: 返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串的位置;
    字符串str的结束标志‘\0’也会被纳入检索范围,所以str的最后一个字符也可以被定位;
    如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数;
    程序例:
#include <stdio.h>
#include <string.h>

int main()
{
    char *s = "0123456789012345678901234567890";
    char *p;
    p = strchr(s, '5');  
    printf("%ld\n", s);  // 输出:134513940
    printf("%ld\n", p);  // 输出:134513945
    p = strrchr(s, '5');
    printf("%ld\n", p);  // 输出:134513965
    return 0;
}
  1. 函数名: strtok
    功 能: 根据分界符将字符串分割成一个个片段
    用 法: char strtok(char s, const char *delim);
    返回值: 返回下一个分割后的字符串指针,如果已无从分割则返回NULL
    说 明: 当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符;
    在第一次调用时,strtok()必须赋予参数s字符串,往后的调用则将参数s设置成NULL;
    程序例:
#include <stdio.h>
#include <string.h>

int main()
{
    char s[] = "ab-cd : ef";
    char *delim = "-: ";
    char *p;
    printf("%s \n", strtok(s, delim));
    // 输出:ab
    //      cd
    //      ef
    while((p = strtok(NULL, delim)))
        printf("%s ", p);
        printf("\n");
}
  1. 函数名: strcmp
    功 能: 字符串比较
    用 法: int strcmp(const char s1, const char s2);
    返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
    说 明: 它是区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数
    程序例:
#include <string.h>
#include <stdio.h>

int main(void)
 {
    char *a = "aBcDeF";
    char *b = "AbCdEf";
    char *c = "aacdef";
    char *d = "aBcDeF";
    printf("strcmp(a, b) : %d\n", strcmp(a, b));  // 输出:1
    printf("strcmp(a, c) : %d\n", strcmp(a, c));  // 输出:-1
    printf("strcmp(a, d) : %d\n", strcmp(a, d));  // 输出:0
    return 0;
 }
  1. 函数名: strspn
    功 能: 用来计算字符串str中连续有几个字符都属于字符串 accept
    用 法: size_t strspn(const char str, const char accept);
    返回值: 返回字符串str开头连续包含字符串accept内的字符数目。所以,如果str所包含的字符都属于accept,那么返回str的长度;如果str的第一个字符不属于accept,那么返回0
    说 明: 检索的字符是区分大小写的;
    函数 strcspn() 的含义与 strspn() 相反,它用来用来计算字符串str中连续有几个字符都不属于字符串accept;
    程序例:
(1)
#include <stdio.h>
#include <string.h>
int main ()
{
    int i;
    char str[] = "129th";
    char accept[] = "1234567890";

    i = strspn(str, accept);
    printf("str 前 %d 个字符都属于 accept\n",i);  // 输出:str 前 3 个字符都属于 accept
    return 0;
}

(2)一个strcspn()的例子

#include<stdio.h>
#include<string.h>

int main()
{
    char* s1 = "http://c.biancheng.net/cpp/xitong/";
    char* s2 = "z -+*";

    if(strlen(s1) == strcspn(s1,s2)){
        printf("s1 is diffrent from s2!\n");  // 输出:s1 is diffrent from s2!
    }else{
        printf("There is at least one same character in s1 and s2!\n");
    }
    return 0;
}

6.函数名: strcpy
功 能: 将参数src字符串拷贝至参数dest所指的地址
用 法: char strcpy(char dest, const char *src);
返回值: 返回参数dest的字符串起始地址
说 明: 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代;
程序例:

#include <stdio.h>
#include <string.h>

int main(void)
 {
    char string[10];
    char *str1 = "abcdefghi";

    strcpy(string, str1);
    printf("%s\n", string);  // 输出:abcdefghi
    return 0;
 }
  1. 函数名: strncpy
    功 能: 将字符串src前n个字符拷贝到字符串dest
    用 法: char strncpy(char dest, const char *src, size_t n);
    返回值: 返回参数dest的字符串起始地址
    说 明: 不像strcpy(),strncpy()不会向dest追加结束标记'\0';
    src和dest所指的内存区域不能重叠,且dest必须有足够的空间放置n个字符;
    程序例:
#include <stdio.h>
#include <string.h>

int main(void)
{
  char string[10];
  char *str1 = "abcdefghi";

  strncpy(string, str1, 3);
  string[3] = '\0';
  printf("%s\n", string);  // 输出:abc
  return 0;
}

对于字符串基本知识整理的一些博客链接!

  1. C语言中字符串和数字的相互转换实现代码 [https://www.jb51.net/article/39686.htm]
  2. C语言字符串原地压缩实现方法[https://www.jb51.net/article/55279.htm]
  3. C语言实现字符串匹配KMP算法 [https://www.jb51.net/article/54123.htm]
  4. c语言输出字符串中最大对称子串长度的3种解决方案 [https://www.jb51.net/article/48090.htm]
  5. 使用C语言递归与非递归实现字符串反转函数char reverse(char str)的方法[https://www.jb51.net/article/37495.htm]
  6. c语言字符数组与字符串的使用详解[https://www.jb51.net/article/37456.htm]
  7. KMP算法的通俗解释!![https://blog.csdn.net/x__1998/article/details/79951598]