4.3、字符串

本文深入探讨了C语言中字符串的概念及其实现方式,包括字符串在不同存储区域的分配、长度的计算方法、以及如何使用标准库函数进行字符串操作。特别强调了在实际编程中避免重新发明轮子的重要性。
1、从概念上讲,C语言中没有字符串数据类型
   在C语言中使用字符数组来模拟字符串
   C语言中的字符串是以'\0'结束的字符数组
   C语言中的字符串可以分配于栈空间、堆空间或者只读存储区

2、
   char* s3 = "Hello";                         分配在只读存储区,值不能被改变
   char s1[] = {'H', 'e', 'l', 'l', 'o', '\0'};分配在栈区
   char* s2 = (char*)malloc(6*sizeof(char));   分配在堆区

3、
   字符串的长度就是字符串所包含字符的个数
   C语言中的字符串长度指的是第一个'\0'字符前出现的字符个数
   C语言中通过'\0'结束符来确定字符串的长度

4、字符串长度
    警告
  char* a = "123";
  char* b = "1234";

  if( strlen(a) >= strlen(b) )
  {
    //......
   }

   if( strlen(a) - strlen(b) >= 0)
  {
    //......
   }
  strlen的返回值是用无符号数定义的,因此相减不可能产生负数,以上的语句不等价

5、用一条语句实现strlen
    size_t strlen(const char* s)
    {
        return ( assert(s), (*s ? (strlen(s+1) + 1) : 0) );
    }

6、注意:
    一般情况下,千万千万不要自行编写C标准库已经提供的函数
    标准库有时会使用汇编语言实现,目的就是为了充分利用机器所提供的特殊指令以追求最大的速度
    复用已经存在的函数库会更高效

          重复发明轮子并不是一件有创造性的工作

7、不受限制的字符串函数
     不受限制的字符串函数是通过寻找字符串的结束符'\0'来判断长度
   字符串复制:
           char* strcpy(char* dst, const char* src);
   字符串连接:
           char* strcat(char* dst, cons char* src);
   字符串比较:
           int strcmp(const char* s1, const char* s2);

8、注意事项
    不受限制的字符串函数都是以'\0'作为结尾标记来进行的,因此输入参数中必须包含'\0'
    strcpy和strcat必须保证目标字符数组的剩余空间足以保存整个源字符串
    strcmp以0值表示两个字符串相等
       ·第一个字符串大于第二个字符串的时候返回值大于0
       ·第一个字符串小于第二个字符串的时候返回值小于0
    strcmp不会修改参数值,但依然以'\0'作为结束符

9、strcpy面试题
char* strcpy(char* dst, const char* src)
{
    char* ret = dst;
    
    assert(dst && src);   //安全检测
    
    while( (*dst++ = *src++) != '\0' );
    
    return ret;
}

10、长度受限的字符串函数
     长度受限的字符串函数接收一个显示的长度参数用于限定操作的字符数
    字符串复制:
        char* strncpy(char* dst, const char* src, size_t len);
    字符串连接:
        char* strncat(char* dst, const char* src, size_t len);
    字符串比较:
        int strncmp(const char* s1, const char* s2, size_t len);

11、注意事项
     strncpy只复制len个字符到目标字符串
       ·当源字符串的长度小于len时,剩余的空间以'\0'填充
       ·当源字符串的长度大于len时,只有len个字符会被复制,且它将不会以'\0'结束
     strncat最多从源字符中复制len个字符到目标串中
       ·strncat总在结果字符串后面添加'\0'
       ·strncat不会用'\0'填充目标中剩余空间
     strncmp只比较len个字符是否相等
Python并没有4.3版本。不过,Python中字符串常见操作及内置方法有很多。 ### 内置方法 - **统计类**:`count` 用于返回子串在字符串中的出现次数(非重叠)。例如: ```python s = "hello world, hello python" print(s.count("hello")) ``` - **判断类**:`endswith` 和 `startswith` 分别用于判断字符串是否以某个后缀结尾、以某个前缀开头,若是则返回 `True`。示例: ```python s = "hello world" print(s.endswith("world")) print(s.startswith("hello")) ``` - **连接类**:`join` 可将字符串用作连接其他字符串序列的分隔符。示例: ```python words = ["hello", "world"] print(" ".join(words)) ``` - **查找类**: - `index` 如果在字符串中找到子串,则返回子串第一个字符所在的位置,若未找到则引发 `ValueError`。 - `find` 若在字符串中找到子串,返回第一个发现的子串的第一个字符所在的位置,未找到返回 -1。 - `rfind` 若找到子串,返回最后一个发现的子串的第一个字符所在的位置,未找到返回 -1。示例: ```python s = "hello world" print(s.index("world")) print(s.find("world")) print(s.rfind("l")) ``` - **替换类**:`replace` 用于用另一个字符串替换指定子串。示例: ```python s = "hello world" print(s.replace("world", "python")) ``` - **去除空白类**:`strip`、`rstrip`、`lstrip` 用于去除空白符(包括换行符),分别是去除两端、右端、左端的空白符。示例: ```python s = " hello world " print(s.strip()) print(s.rstrip()) print(s.lstrip()) ``` - **拆分类**:`split` 通过指定的分隔符将字符串拆分为一组子串。示例: ```python s = "hello,world,python" print(s.split(",")) ``` - **大小写转换类**:`lower` 和 `upper` 分别将字母字符转换为小写或大写。示例: ```python s = "Hello World" print(s.lower()) print(s.upper()) ``` - **填充类**:`ljust` 和 `rjust` 用空格(或其他字符)填充字符串的空白侧以返回符合最低宽度的字符串。示例: ```python s = "hello" print(s.ljust(10, "*")) print(s.rjust(10, "*")) ``` ### 正则表达式操作 在处理字符串时,正则表达式能完成模式匹配、替换、拆分等操作。使用时需引入正则表达式的包 `re`。 - **拆分**:`re.split` 可根据分隔符拆分字符串。例如: ```python import re text = "foo bar\t baz \tqux" print(re.split('\s+', text)) ``` 若许多字符串应用同一条正则表达式,可提前用 `re.compile` 编译一次,以节省时间。示例: ```python import re text = "foo bar\t baz \tqux" erase_space = re.compile('\s+') print(re.split(erase_space, text)) ``` - **匹配**:`re.findall` 用于根据正则表达式匹配所有模式。示例: ```python import re text = "foo bar\t baz \tqux" erase_space = re.compile('\s+') print(erase_space.findall(text)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值