C语言中的特殊数组-字符串处理函数(下)-学习笔记-7

字符串处理函数

C 函数库中提供了一些专门处理字符串的函数,非常方便,我们来看一下。

注意
在使用下列函数前,需要在头文件中包含string.h文件。

Put 函数

put 函数,就是输出字符串的函数。

一般形式

put (字符数组)

1
2
3
char C[]="I am coder!"
puts(C);
//终端上就会显示 I am coder!

作用

和 printf 函数类似,只不过 put 函数直接输出字符串到终端,并且遇到\0 就自动停止输出。
可以类比的和printf("%s",字符数组名)来记忆。

特殊

puts 函数中可以包含转义字符

1
2
3
4
5
char C[]="no.1\nno.2";
puts(C);
//输出结果是
//no.1
//no.2

gets 函数

gets 函数,就是输入字符串的函数

一般形式

gets(字符数组)

作用

从终端输入一个字符串到字符数组,返回值是该数组的内存起始地址。

特殊

无论是 puts 还是 gets,都只能将字符串传输给一个字符数组,不能同时操作两个

1
2
3
puts(C,D);
gets(C,D);
//上面的两种写法都是错误的。

如果需要使用 gets 或者 puts 输出多个字符串的,可以使用 for 循环来完成

1
2
3
4
5
char str[3][20];
for(int i=0;i<3;i++){
gets(str[i]);
}
//这样即可完成向二维字符数组的每一行插入字符串

strcat 函数

strcat 函数,就是字符串连接函数。

一般形式

strcat(字符数组1,字符数组2)

作用

strcat 是 STRing CATenate(字符串连接)的缩写,作用是把两个字符数组中的字符串连接起来。
字符数组2接到字符数组1后面,结果存放在字符数组1中。

返回值

返回的是字符数组1的地址,可以直接在 printf 里面调用

特殊

连接的字符数组1必须足够大,否则装不下字符数组2的内容。

1
2
3
4
5
6
7
8
#include <stdio.h>
#include<string.h>
int main(){
char str1[30]="People's Republic of ";
char str2[]="China\n";
printf("%s",strcat(str1,str2));
//输出 People's Republic of China
}

上面的例子中我们给 str1 规定了数组长度为30,如果我们不指定其字符长度呢?
如果不指定长度,那么数组的长的就是初始化时元素的个数,在上面的例子中,如果不指定 str1 数组长度是30,那么str1的长度也就是 21。

注意
所以,我么需要在将要合并的字符数组的第一个数组,指定一个可以包含所有元素的数组长度。

strcpy 函数 和 strncpy 函数

这两个函数都是字符串复制函数,strcpy 是将字符串2复制到字符数组1中,strncpy 加了 n 之后,就是把 字符串2 的前 n 个字符复制到数组1中。

一般形式

strcpy(字符数组1,字符数组2)
strcpy(字符数组1,字符数组2,位数)

作用

字符数组2中的内容或者部分内容替换或取代字符数组1中的内容。

运行机制
strcpy 这里的复制,可以理解为重新赋值,就是把字符数组2的内容赋值到字符数组1中,取代字符数组1中原有的内容。
strncpy 就不一样了,如果这个 n,不大于字符数组1的长度,那么就是把字符数组1的前 n 个元素替换成了字符数组2的前 n 个元素,字符数组1原有的元素将保留。

返回值

返回的是字符数组1的开始地址,可以直接在 printf 中使用。

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include<string.h>
int main(){
char str1[12]="China";
char str2[]="Beijing";
printf("%s\n",strncpy(str1,str2,3));
}
//上面就是把 Chi 替换成了 Bei
//输出结果为 Beina

strcmp 函数

用来比较字符串的函数

一般形式

strcmp(字符串1,字符串2);

1
2
3
4
5
6
7
strcmp("China",str1);
//字符串和字符数组
strcmp("China","zhongguo");
//字符串和字符串
strcmp(str1,str2);
//字符数组和字符数组、
//以上三种都可以进行比较

作用

strcmp 是 string compare(字符串比较)的缩写,用来比较字符串1和字符串2,如果字符完全相同,则认为两个字符相等,如果不同,则以第一次出现不同的字符的比较结果为准。

比较规则

如果字符串1 = 字符串2 ,则函数值为0;
如果字符串1 > 字符串2,则函数的值为正整数。
如果字符串1 < 字符串2,则函数的值为负整数。

大小规则
这里的大小,主要是在英文字典中字母出现的先后顺序作为依据。例如a > Acomputer > compare,因为 comp 后面的 a > u

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include<string.h>
int main(){
char str1[]="China";
char str2[]="Chinese";
if(strcmp(str1,str2)>0){
printf("China > Chinese\n");
} else {
printf("China < Chinese\n");
}
return 0;
}
//输出结果为 China < Chinese ,因为 a > e,a 比 e 早出现在字典上。

strlen 函数

用于测量字符串的长度

一般形式

strlen (字符数组);

作用

用于测量字符数组中字符串的实际长度,不包括 \0

返回值

返回的是字符串的实际长度的整数。

例子

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
34
35
36
#include <stdio.h>
#include<string.h>
int main(){
char str[50]="China";
printf("China 共有%d 位字符。\n",strlen(str));
return 0;
}
//返回值:China 共有 5 位字符。
```

虽然我们给 str 数组的长度是50,但是 strlen 只会测量实际的字符长度。

{% note warning %}
**想一想**
如果这里是中文呢?会返回多少个字符?
中文的 ASKII 码 中,一般用 3 位数字来表示,所以,会返回6位字符长度。
{% endnote %}

# strlwr 函数
作用是将字符串中的大写字母转换为小写字母。
## 一般形式
strlwr(字符串);
## 作用
strlwr 是 string lowercase 的缩写,如果给定的字符串中,含有大写字母,那么在返回值里,这些大写字母都会转换为小写字母。
## 返回值
返回的是转换成小写字母的字符串。
## 例子

```C
#include<stdio.h>
#include<string.h>
int main(){
char str[]="China";
printf("%s",strlwr(str));
return 0;
}

strupr 函数

作用是将字符串中的大写字母转换为小写字母。

一般形式

strupr(字符串);

作用

strupr 是 string uppercase 的缩写,如果给定的字符串中,含有小写字母,那么在返回值里,这些小写字母都会转换为大写字母。

返回值

返回的是转换成大写字母的字符串。

例子

1
2
3
4
5
6
7
#include <stdio.h>
#include<string.h>
int main(){
char str[]="China";
printf("%s",strupr(str));
return 0;
}

练习

第一题

输入一个字符串,判断里面有几个单词?

思路

先把字符串获取到,放到字符数组中。遍历数组,通过空格来判断单词个数,注意最后的 num=num+1。

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
int main(){
char inputstr[100];
int num=0;
printf("请输入一段话:\n");
gets(inputstr);
for (int i=0;inputstr[i]!='\0';i++){
if(inputstr[i]==' '){
num=num+1;
}
}
if (inputstr[0]=='\0') {
printf("没有输入内容");
}else{
printf("一共有%d个单词",num+1);
}
return 0;
}

第二题

使用一个二维数组,收集三个字符串,然后将二维数组内的三行内容进行比较,输出最大者。

思路

首先建立二维字符数组,然后使用 for 循环和 gets 收集三个字符串,然后通过 strcmp 和 strcpy 函数将最大者输出到中间变量中,最后输出。

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
int main(){
char str[3][20];
char string[10];
for (int i=0; i<3; i++) {
gets(str[i]);
}
if (strcmp(str[0],str[1])>0) {
strcpy(string,str[0]);
}else{
strcpy(string,str[1]);
}
if (strcmp(str[2],string)>0){
strcpy(string, str[2]);
}
printf("最大的是:%s\n",string);
}

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!