千奇百怪的字符串处理函数

最近的周赛与直播都涉及了很多我们大多没有学习过的C语言细节问题
今天学习了一些关于字符串、输入输出函数的知识,
以及整理了一下昨天晚上直播的重点内容 @21级学长zyb
希望能够帮到大家

千奇百怪的字符串处理函数

首先声明,此处使用的函数(如图),需要加入string.h标准库
加入方式如下

1
#include <string.h>

图片

 参考来自菜鸟教程
(https://www.runoob.com/cprogramming/c-strings.html)

这是我们在平时做题时常用的几个函数,比较易懂。
除此之外我还在string.h中为大家多找了几个关于搜索匹配字符的。
是下面这两个

图片1
图片2
(看起来可能参数与返回值都有点吓人,但也就那样。)

 参考来自菜鸟教程
 (https://www.runoob.com/cprogramming/c-standard-library-string-h.html)

相信作为已经学习过函数知识的我们,已经能够学习这些新的函数了
要学习字符串,我们得先拥有一个字符串,字符串的定义方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//定义方式
char 标识符[字符串长度];
//标识符即为名字,字符串长度可以省略。

//为字符串赋值的方式
char string[] = "I'm a string!"; //第一种方法
char string2[6] = "Hello!"; //第二种方法

char string3[10]; //第三种方法
gets(string3);

int n;
scanf("%d",&n); //第四种,应该是最常用的一种方法
char string[1000];
for(int i = 0;i < n;i++)
scanf("%c",&string[i]);

//sprintf(被写入字符串,"写入字符串",格式化符列表)
//括号的后半部分与printf类似,但是它不是为了输出的。
int n;
scanf("%d",&n);
sprintf(string1,"%d",n);

//字符串输出的方式
puts(string);

for(int i = 0;i < n;i++)
putchar(string[i]);
//此处n也可以不定义,在使用第一或者第二种方式时
//可以使用strlen函数或者sizeof运算符 - 1来代替
//len代表length sizeof代表大小,sizeof包含最后的\0,那个不


所谓的字符串,其实就是[由字符组成,以’ \0‘为结束的一维数组]。
’\0’标志着字符串输出的结束,\是转义符号,为了提示它不是数字0

注意,对于字符串的scanf都不需要加取地址符&。
包括sscanf(),虽然它是把字符串内的东西赋给变量或者其他。
和字符串本身无关。

上面的函数给出了几种给字符串赋值的方式,
我觉得你们可能不太好理解的是以下内容:

  • gets()与puts()函数的用法
  • 1000是可以随机的吗
  • strlen函数以及sizeof的用法

这里简单一说

  1. gets()就是获取一段字符串,在括号中需要加入参数,
    参数为字符串(字符数组)
    puts是把字符串打印出来
    其实这两个相似于字符的getchar与putchar
  2. 1000看题目要求,看字符串的最大容量。
  3. strlen是返回字符串的长度,不包含结尾的\0符号,
    sizeof运算符对于字符串来说,是返回包括\0的长度。
    所以sizeof要减一。

下面再说一下这些函数的效果。(看图也可。)

1.strcpy(s1,s2);

s1与s2是形式参数,代表两个字符串,
通过这个函数我们能够覆盖式地把s2复制粘贴到s1上
甚至长度不允许也没关系。

关于记忆,str是string的缩写,cpy是copy的缩写,所以strcpy嘛。
对于很多的函数是可以通过这种方式记忆的
其实用多了就自然记住了。

2.strcat(s1,s2);

s1,s2作用不再赘述。
把s2连接到s1的末尾,改变s1。
可以通过输出看s1的变化,

3.strlen(s1)
返回s1的去掉结尾符号的长度,已经讲过。

4.strcmp(s1,s2);
从第一个字符开始比较,找到不一样的字符,看哪一个更大,哪个字符串就更大。
昨晚在直播中学长讲过了。
大小与返回值的关系请见图。

5.strpbrk(const char* str1, const char* str2);

关于常量字符串为什么这样写我还不太明白,我想让群里的大佬给我解释解释。

分析第一个字符串的字符,与第二个字符串内的字符比对
只要找出两个字符串都包含的字符就返回那个字符。

很好理解。
比如,"AABB"与"BCDE",就会返回B。

6.strspn(const char* str1, const char* str2);

也是分析两个字符串的字符,逐对分析,直到找到两字符串位置一样但不一样的字符。
返回那个字符的下标,注意不是字符。

想要给大家说这些的原因是,有些数字的位数处理用字符串可能会更快,
比如在周五的练习六题解里的那一道题,去第一位与最后一位为素数。
这在我刚开始学习C语言的时候就感觉到了。
Python中的字符串处理有很多的内建函数,处理起来很方便。
但是C语言中竟然连字符串变量都不能定义,而且定义与赋值起来很麻烦。
所以学好字符串还是很有必要的。

还有一个是 @空梦Kmar 的建议
尽量使用C标准库函数,这样能够极大地优化程序的效率。
详细的建议在他的博客里,第一条就是优先使用库函数。
关于C语言编码的一些建议 | 山岳库博 (kmar.top)
包括昨晚学长提到的qsort函数,就解决了我们排序数组的问题
还有用于交换数组排序的swap函数。
所以学习C语言标准库而不是自己写还是很好的,而且很省事。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2024 大学生暮暖
  • 访问人数: | 浏览次数:

请我喝杯奶茶吧~

支付宝
微信