字符数组与字符串
字符数组与字符串区别
- C 语言中没有字符串这种数据类型,可以通过 char 的数组来替代
- 数字 0(和字符 '\0' 等价) 结尾的 char 数组就是一个字符串,字符串是一种特殊的 char 的数组
- 如果 char 数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组
c
#include <stdio.h>
int main() {
char c1[] = {'c', ' ', 'p', 'r', 'o', 'g'}; // 普通字符数组
printf("c1 = %s\n", c1); // 有可能乱码,因为没有'\0'结束符
// 以'\0'('\0'就是数字 0) 结尾的字符数组是字符串
char c2[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0'};
printf("c2 = %s\n", c2);
// 字符串处理以'\0'(数字 0) 作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
char c3[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
printf("c3 = %s\n", c3);
// 使用字符串初始化,编译器自动在后面补 0,常用
char c4[] = "c prog";
printf("c4 = %s\n", c4);
return 0;
}
字符串的输入输出
由于字符串采用了 '\0'
标志,字符串的输入输出将变得简单方便
c
#include <stdio.h>
int main()
{
char str[100];
printf("input string1: ");
// scanf("%s",str) 默认以空格分隔
// 可以输入空格
gets(str);
printf("output: %s\n", str);
return 0;
}
字符指针
字符指针可直接赋值为字符串,保存的实际上是字符串的首地址
这时候,字符串指针所指向的内存不能修改,指针变量本身可以修改
c
#include <stdio.h>
int main() {
char *p = "hello"; // 和 const char *p = 'hello' 等价,有没有 const 都一样
// 指针变量所指向的内存不能修改
// *p = 'a'; // err
printf("p = %s\n", p);
// 指针变量可以修改
p = "world";
printf("p = %s\n", p);
return 0;
}
字符串常用库函数
strlen
函数说明:
c
#include <string.h>
size_t strlen(const char *s);
功能:计算指定指定字符串 s 的长度,不包含字符串结束符‘\0’
参数:
s:字符串首地址
返回值:字符串 s 的长度,size_t 为 unsigned int 类型,不同平台会不一样
示例代码:
c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "abcdefg";
int n = strlen(str);
printf("n = %d\n", n);
return 0;
}
运行结果:
n = 7
strcpy
函数说明:
c
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "123456789";
char src[] = "hello world";
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}
运行结果:
shell
hello world
strcat
函数说明:
c
#include <string.h>
char *strcat(char *dest, const char *src);
功能:将 src 字符串连接到 dest 的尾部,‘\0’也会追加过去
参数:
dest:目的字符串首地址
src:源字符首地址
返回值:
成功:返回 dest 字符串的首地址
失败:NULL
示例代码:
c
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "123";
char *src = "hello world";
strcat(str, src);
printf("%s\n", str);
return 0;
}
运行结果:
shell
123hello world
strcmp
函数说明:
c
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较 s1 和 s2 的大小,比较的是字符 ASCII 码大小。
参数:
s1:字符串 1 首地址
s2:字符串 2 首地址
返回值:
相等:0
大于:>0
小于:<0
示例代码:
c
#include <stdio.h>
#include <string.h>
int main() {
char *str1 = "hello world";
char *str2 = "hello mike";
if (strcmp(str1, str2) == 0) {
printf("str1==str2\n");
} else if (strcmp(str1, str2) > 0) {
printf("str1>str2\n");
} else {
printf("str1<str2\n");
}
return 0;
}
运行结果:
shell
str1>str2
字符串案例
需求:自定义一个函数 my_strlen(),实现的功能和 strlen 一样
c
#include <stdio.h>
// 函数定义
int my_strlen(char * temp) {
// 定义一个累加个数的变量,初始值为 0
int i = 0;
// 循环遍历每一个字符,如果是'\0'跳出循环
while (temp[i] != '\0') {
// 下标累加
i++;
}
return i;
}
int main() {
char *p = "hello";
// 函数调用
int n = my_strlen(p);
printf("n = %d\n", n);
return 0;
}