目录
《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介
1、引入
用于输入输出的字符串函数
,例如printf
、puts
、scanf
、gets
等,使用时要包含头文件stdio.h
,而使用其它字符串函数
要包含头文件string.h
。 string.h
其中有大量操作字符串的函数:
本节涉及函数英文全称 | 序号 | 函数 & 目的 |
---|---|---|
strcmp: string compare | strcpy(s1, s2); | 复制字符串 s2 到字符串 s1。 |
strcat: string catenate | strcat(s1, s2); | 连接字符串 s2 到字符串 s1 的末尾。 |
strcpy: string copy | strlen(s1); | 返回字符串 s1 的长度。 |
strlen: string length | strcmp(s1, s2); | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
strlwr: string lowercase | strchr(s1, ch); | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
strupr: string upercase | strstr(s1, s2); | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
我们下面拿应用开发最常用的几个函数讲一下!
2、字符串长度函数 strlen()
2.1、原型
size_t strlen (const char * str);
字符串拷贝,拷贝到源头字符串中的 \0 为⽌。
2.2、注意点
- strlen 函数统计的是
字符串中 '\0' 之前的``字符的个数
,所以传递给 strlen 函数的形参字符串中必须得包含 '\0'
; - strlen 函数的返回值为
size_t
,是⽆符号的( 易错 ); - strlen 函数的使用需要
包含头⽂件
;
2.3、代码举例
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcdef";
printf("%d\n", strlen(str1));
char str2[10] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", strlen(str2));
char str3[] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", strlen(str3));
//strlen 和 sizeof 的对比
printf("%d\n", strlen(str1));
printf("%d\n", sizeof(str1));
return 0;
}
运行结果:
6
6
14
6
10
2.4、详细分析
str1 数组是使用常量字符串初始化,也是不完全初始化,前⾯ 7 个元素存放了 a、b、c、d、e、f、\0,剩余的元素默认初始化为 0,也就是 \0。
str2 数组是使用大括号的⽅式初始化,也是不完全初始化,前⾯ 6 个元素存放了 a、b、c、d、e、f,剩余的元素默认初始化为 0,也就是 \0。
str3 数组也是使用大括号初始化的,同时没有直接指定数组大小,数组大小是根据初始化内容来确定的。数组中仅存储了 a、b、c、d、e、f,没有 \0 字符。
3、strlen 与 sizeof 的区别
strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型。
sizeof
计算的是变量的大小,不受字符
\0
影响
;strlen
计算的是字符串的长度,以
\0
作为长度判定依据
。
例如:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char s[] = { "hello,world!" };
printf("s = %s\n", s);
printf("sizeof(s) = %d\n", sizeof(s));
printf("strlen(s) = %d\n", strlen(s));
return 0;
}
输出结果为:
s = hello,world!
sizeof(s) = 13
strlen(s) = 12
4、字符串复制函数 strcpy()
字符串拷贝,拷贝到源头字符串中的 ‘\0’ 为⽌。
简单说就是,字符串复制,也即将字符串从一个地方复制到另外一个地方。
4.1、原型
char* strcpy(char * destination, const char * source);
strcpy() 函数会把 source 中的字符串拷贝到 destination 中
,字符串结束标志'\0'也一同拷贝
。
参数
:
destination :指针,指向目的地空间;
source :指针,指向源头数据;
返回值
:
strcpy 函数返回的目标空间的起始地址;
4.2、注意点
- 源字符串必须以 ‘\0’ 结束;
- 会将源字符串中的 ‘\0’ 拷贝到目标空间;
- 目标空间必须⾜够大,以确保能存放源字符串;
- 目标空间必须可修改;
4.3、代码举例
#include <stdio.h>
#include <string.h>
int main(){
char str1[50] = "《C语言入门教程》";
char str2[50] = "http://baidu.com";
strcpy(str1, str2);
printf("str1: %s\n", str1);
return 0;
}
运行结果:
str1: http://baidu.com
将 str2 复制到 str1 后,str1 中原来的内容就被覆盖了。
5、字符串比较函数 strcmp()
用来比较 str1 和 str2 指向的字符串,从两个字符串的第⼀个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。
5.1、原型
int strcmp (const char * str1, const char * str2);
参数
:
str1 :指针,指向要比较的第⼀个字符串;
str2 :指针,指向要比较的第二个字符串;
返回值
:
int 型(大于 0 的数字 | 0 | 小于 0 的数字);
5.2、注意点
- 第⼀个字符串大于第二个字符串,则返回大于 0 的数字;
- 第⼀个字符串等于第二个字符串,则返回 0;
- 第⼀个字符串小于第二个字符串,则返回小于 0 的数字;
5.3、代码举例
对 4 组字符串进行比较:
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "aBcDeF";
char b[] = "AbCdEf";
char c[] = "aacdef";
char d[] = "aBcDeF";
printf("a VS b: %d\n", strcmp(a, b));
printf("a VS c: %d\n", strcmp(a, c));
printf("a VS d: %d\n", strcmp(a, d));
return 0;
}
运行结果:
a VS b: 32
a VS c: -31
a VS d: 0
6、字符串连接函数 strcat()
strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起。
6.1、原型
char * strcat (char * destination, const char * source);
source 、destination 为需要拼接的字符串。
用来字符串追加,把 source 指向的源字符串中的所有字符都追加到 destination 指向的空间中。
参数
:
destination :指针,指向目的地空间;
source :指针,指向源头数据;
返回值
:
strcat 函数返回的目标空间的起始地址;
6.2、注意点
- 源字符串
source
必须以 ‘\0’ 结束。 - 目标字符串
destination
中也得有 \0 ,否则没办法知道追加从哪⾥开始。 - strcat() 将
把 source 连接到 destination 后面
,并删除原来destination
最后的结束标志'\0'
。
这意味着:destination 必须足够长,要能够同时容纳 source 和 destination ,否则会越界(超出范围)
。
- strcat() 的返回值为
destination
的地址。
6.3、代码举例
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100]="The URL is ";
char str2[60];
printf("Input a URL: ");
gets(str2);
strcat(str1, str2);
puts(str1);
return 0;
}
运行结果:
Input a URL: http://baidu.com↙
The URL ishttp://baidu.com
您可以在 C 标准库中找到更多字符串相关的函数。
《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介
每日一更!
公众号、优快云等博客:小菜狗编程笔记
谢谢点赞关注哈!目前在飞书持续优化更新~
日更较慢有需要完整笔记请私我,C/C++/数据结构-算法/单片机51-STM32-GD32-ESP32/嵌入式/Linux操作系统/uboot/Linux内核-驱动-应用/硬件入门-PCB-layout/Python/后期小程序和机器学习!