1. 字符数组与字符串
1.1 字符数组的初始化
注意点:
1.2 字符串常用初始化方式
1.3 种子的使用
1.4 冒泡排序推导
1.5 获取一维数组相关信息
1.6 获取二维数组相关信息
输出结果:
=======================================================================
2. 字符串处理函数
2.1 scanf()
的用法
输出展示如下,默认以空格分离:
再添加一个示例:
输出结果如下:
以上问题涉及缓冲区问题,跟getchar
类似:
- 执行第一个
scanf
时:
- 执行第二个
scanf
时:
scanf
函数的缺陷:scanf
不会去做数组的越界检查,但是在Visual Studio里数组越界会报错,也正是因为这个函数很危险,所以如果在Visual Studio如果不加入
#define _CRT_SECURE_NO_WARNINGS
的宏定义,scanf
函数将不允许被使用:
2.2 gets()
的用法
2.3 fgets()
的用法
这是一个最为常用的输入函数,因为它比较安全。输出只取指定的size
:
2.4 puts()
的用法
输出结果显示,和printf相比,puts会自动在屏幕换行,但字符串本身不变:
2.5 fputs()
的用法
和printf类似,差别不大,这个主要用在文件:
2.6 strlen()
的用法
测量字符串的长度,此时输出结果是5:
若对应这么一个情况,输出结果是0,因为遇见结束符,strlen
就结束:
重点注意的是sizeof
和strlen
测量字符串时的区别:
sizeof
测量时会把结束符也算进去,strlen
不会- 此处第一个
sizeof
输出6,第二个sizeof
输出7
最终结果如下:
2.7 strcpy()
的用法
实现字符串的拷贝:
遇见'\0'
就结束拷贝:
2.8 strncpy()
的用法
- 情况1
int main()
{
char src[100] = "hello mike";//源字符串
char dst[100] = "aaaaaaaaaaaaaaaaaaaaa"
strncpy(dst, src, strlen(src));
printf("dst = %s\n", dst);
}
输出结果:
hello mikeaaaaaaaaaaaaaaaaa
以上情况时只拷贝了hello mike
这十个字符,strlen
遇到\0
结束,所以没有把\0
也拷贝过去。
- 情况2
int main()
{
char src[100] = "hello mike";//源字符串
char dst[100] = "aaaaaaaaaaaaaaaaaaaaa"
strncpy(dst, src, strlen(src)+1);
printf("dst = %s\n", dst);
}
输出结果:
hello mike
这个时候strncpy
把src
的\0
也一并考过去了,所以到dst
输出的时候,遇到\0
就结束了,所以后面的aaaaaaaaaaaa
就不会输出了。
- 情况3
这个时候查看能不能拷贝\0
过去的时候发现不行,它虽然能把\0
拷贝过去,但是\0
后面的内容无法拷贝,也就显示不出来。
- 缺点:数组越界不会报错
Linux 上的输出结果:
2.9 strcmp()
的用法
函数原型int strcmp(const char *s1,const char *s2);
设这两个字符串为s1,s2,规则为:
- 当s1<s2时,返回为负数
- 当s1=s2时,返回值= 0
- 当s1>s2时,返回正数
逐个比较单个元素的ASCII码,谁大哪个字符串就大。
2.10 fprint()
的用法
和printf()
一样,只是输出到指定数组