C语言8--字符串

字符串
1.概念
计算机使用多个连续的字符类型存储空间来文字信息
代码中表示字符串使用第一个字符类型存储位置的地址来代表整串文字信息。
使用ASCII表中值为0的字符’\0’作为文字信息的结束位置。
文字信息中所有的有效字符加上’\0’叫做字符串。
使用字符类型指针(char *)记录一个字符串的首地址,也用它来代表整个字符串。

2.字符串的使用
(1)字符串常量
C语言中用双引号括起来的内容叫字符串常量,比如:“abc” “123” “你好”
字符串常量存放在特殊的段落,在程序运行时不能被修改
编译器在处理字符串常量时会在最后加上’\0’,自动用第一个字符的地址来代替整个字符串常量。
注:字符串在printf函数中对应的占位符%s

(2)字符串变量
可以使用字符数组在程序中表示字符串
编译器不会自动在字符数组后添加’\0’
可以使用字符串常量去初始化字符数组,此时字符数组会得到字符串常量的所有字符。
char m_str[] = “hello”;
//此时m_str是字符串变量,可以修改
char *str = “hello”;
//此时str是字符串常量,不能修改

3.字符串的输入输出
(1)输出
使用printf打印字符串对应的占位符是%s,%s配对的数据是字符串首地址。
(2)输入
scanf函数可以读取键盘输入的字符串,占位符%s,但是scanf函数不处理越界,有内存非法访问的危险。

推荐使用fgets函数来读取输入的字符串,用法如下:
fgets(字符数组首地址,读取字符长度,stdin);
//stdin代表键盘
//最多读取给定长度减1的字符个数
//fgets函数会读取最后输入的换行符

注:连续调用fgets函数读取键盘数据可能导致缓冲区中有垃圾数据,需要进行缓冲区清空的操作。

4.多个字符串的表示和存储
(1)字符类型的二维数组
字符类型的二维数组可以用来表示多个相关的字符串。这种表示方式可以对字符串本身的内容进行修改,这种表示方式容易空间浪费,使用起来不灵活。
语法如下:
char countries[][10] = {“China”, “Japan”, “America”, “Russia”, “England”, “France”};

(2)字符类型的指针数组
字符类型的指针数组可以用来表示多个相关的字符串。这种表示方式不能对字符串本身的内容进行修改,但是可以修改指向的地址。这种表示方式更加灵活,各个字符串占用的空间可以不同,不会造成空间浪费。
语法如下:
char *countries[] = {“China”, “Japan”, “America”, “Russia”, “England”, “France”};

5.字符串的相关标准函数
C语言提供了一系列的标准函数对字符串进行各种基本处理
使用这些标准函数需要包含头文件string.h

(1)strlen ------------------- 计算字符串中有效字符的个数(不包含’\0’)
size_t strlen(const char *s);
参数:
s - 要计算长度的字符串
返回值:
返回字符串中有效字符的个数

(2)strcpy和strncpy ------------ 把一个字符串的内容拷贝到一个字符数组中。
char *strcpy(char *dest, const char *src);
参数:
dest - 拷贝的目标字符串
src - 拷贝的源字符串
返回值:
返回第一个参数(dest)

char *strncpy(char *dest, const char *src, size_t n);
参数:
dest - 拷贝的目标字符串
src - 拷贝的源字符串
n - 最多拷贝n个字符
返回值:
返回第一个参数(dest)

(3)strcat和strncat --------- 把一个字符串的内容合并到一个字符数组的末尾。
char *strcat(char *dest, const char *src);
参数:
dest - 合并的目标字符串
src - 合并的源字符串
返回值:
返回第一个参数(dest)

char *strncat(char *dest, const char *src, size_t n);
参数:
dest - 合并的目标字符串
src - 合并的源字符串
n - 最多合并n个字符
返回值:
返回第一个参数(dest)

(4)strcmp和strncmp ------ 比较两个字符串的内容是否一样
int strcmp(const char *s1, const char *s2);
参数:
s1 - 比较的字符串1
s2 - 比较的字符串2
返回值:
返回0表示两个字符串相同,s1<s2返回小于0,s1>s2返回大于0

注:所谓的大小指的是第一个不同字符的ascii值大小

int strncmp(const char *s1, const char *s2, size_t n);
参数:
s1 - 比较的字符串1
s2 - 比较的字符串2
n - 比较两个字符串的前n个字符
返回值:
返回0表示两个字符串相同,s1<s2返回小于0,s1>s2返回大于0

补充:
(5)strstr -------- 在一个字符串中的查找子串
char *strstr(const char *haystack, const char *needle);
参数:
haystack - 源字符串
needle - 要查找的字符串
返回值:
成功返回指向第一个匹配子串的指针,查找失败返回NULL

(6)strtok -------- 将某个字符串按给定的分隔符拆分成子串
char *strtok(char *str, const char *delim);
参数:
str - 要拆分的源字符串
delim - 分隔符
返回值:
依次返回拆解出的子串,返回NULL表示拆分结束

注:拆分字符串是会修改源字符串
首次调用str传源字符串,此后每次调用用str传NULL

(7)strchr和strrchr ------- 在指定字符串中查找某个字符
char *strchr(const char *s, int c);
参数:
s - 源字符串
c - 要查找的字符
返回值:
成功返回第一个找到字符的指针,失败返回NULL

char *strrchr(const char *s, int c);
参数:
s - 源字符串
c - 要查找的字符
返回值:
成功返回最后一个找到字符的指针,失败返回NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值