第十一章 字符串和字符串函数
11.1 i表示字符串和字符串I/O
- puts()函数只显示字符串,而且自动在显示的字符串末尾加上换行符
11.1.1 在程序中定义字符串
- 字符串字面量(字符串常量)
- 用双引号括起来的内容称为字符串字面量(string literal),也叫字符串常量(string constant)
- 字符串常量属于静态储存类别
- 字符串数组和初始化
- 让编译器计算数组大小只能用在初始化数组时。如果创建一个稍后再填充的数组,就必须在声明时指定大小。
- 两种初始化:
1 2
1. 字符数组名初始化: char car[10] = "Tata"; 2. 指针数组初始化: char * pt1 = "Something is pointing at me";
- 数组和指针的区别
- 字符串储存在静态储存区中
- 初始化数组把静态存储区的【字符串】拷贝到数组中,而初始化指针只把字符串的【地址】拷贝给指针
- 数组的元素是变量(除非数组被声明成const),但数组名不是变量。
- 如果不修改字符串,不要用指针指向字符串字面量。
- 字符串数组
- 创建字符数组:
1 2
1. 指向字符串的字符数组 2. char类型数组的数组
- 下标访问字符串
- 字符串数组[字符串下标][字符串字符]
- 字符数组和char数组的区别:
1 2 3
1. 大小不同,类型不同。 2. 储存方式不同,静态内存和副本的区别。 3. 字符串数组分配内存的使用率较低。
- 在选择上
1 2
1.需求效率:使用指针数组,但是不可修改,会擦写程序内存。 2.需求更改或输入:使用字符数组,但是效率低。
- 创建字符数组:
11.1.2 指针和字符串
- 区分指针的值,指针指向的值:指针的值是指向的地址,指针指向的值是地址存储的内容。
11.2 字符串输入
11.2.1 分配空间
- 在创建字符串数组时有必要分配空间,以防止擦写其他程序或内存
1 2
1.在声明时显式指明数组大小 2.使用C库函数来分配内存
11.2.2 不幸的gets()函数
- 本是用于处理整行输入。
- gets()函数只知道数组的开始处,并不知道其中有多少个元素。如果输入的字符串过长,可能会导致缓冲区溢出。
- gets()函数会读取输入至换行符,并丢弃换行符,在末尾添加\0,进行存储。
11.2.3 gets()函数的代替品
- fgets()函数( 和fputs()函数 )
- 三大特点:
1 2 3
1. 限制: fgets()函数指明了读入字符的最大数量,保存在第二个参数中,如果参数是n,那么将读取n-1个字符。 2. 保留: 如果fget()函数读取到一个换行符,那么会将其储存而不是删除。 3. 来源: fgets()第三个参数指明要读取的文件。如果来源于键盘,则以stdin为参数。
- puts()函数会在输入的字符串末尾添加一个换行符,而fgets()不会。
- fgets()处理多行输入:
1 2 3
while(fgets(words,lens,stdin)!=NULL && word[0]!='\n'){ fputs(words,stdout); }
- get_s()函数
- 基本形式:
1
get_s(字符串地址,大小);
- get_s()与fgets()的区别:
1 2 3
1. get_s()没有第三个参数,只从标准输入中读取数据。 2. get_s()如果读到换行符,会舍弃它。 3.
- 关于选择:
- 存储区装得下输入,三者无差,但fgets()会保留\n
- 存储区装不下输入,fgets()可以灵活处理。
11.2.4 scanf()函数
- scanf(),fgets()和gets()函数的区别在于如何确定字符串的末尾。
- scanf()函数会返回一个整数值,该值等于scanf()成功读取的项数或者EOF(读到文件末尾)
- %s可防止输入溢出。
11.3 字符串输入
- 打印字符串的三个标准库函数:puts(),fputs()和printf();
- puts()函数
- 传入地址。
- puts()函数会在字符串末尾自动添加一个\n;
- 该函数遇到空字符就会停止输出,所以必须保证又空字符存在。
- gets()丢弃换行符,但puts()添加换行符
- fputs()函数
- 第二个参数指明来源
- 不会在输出的末尾添加\n
- fgets()保留换行符,且fputs()不会添加换行符。
- printf()函数
- 打印多个字符串比较简单。
11.4 自定义输入/输出函数
- 自己写函数
|
|
11.5 字符串函数
-
strlen()函数
- 表示长度,存在于string.h
-
strcat()函数
- 作用:拼接两个字符串
- 示例
1
strcat(str1,str2); // 将str2拼接到str1后面,改变str1而不改变str2
- 缺点:strcat无法检测第一个数组能否容纳第二个数组,可能会造成字符溢出。
-
strncat()函数
- 改进strcat()函数,第三个参数指定最大添加字符数,末尾自动添加空字符。
- 示例
1
strnact(str1,str2,size); //将str2的前size个字符拼接到str1后面。
-
strcmp()函数
- 作用:比较字符串,如果相同则返回0,否则返回非零值。
- 示例
1
strcmp(str1,str2);
- 本机操作 返回的值:从不相同的字符开始,前一个字符排在ascii前则返回-1,否则返回1,相同0;
- 书本 返回的值是前一个字符串的acsii码减后一个的,按照机器排序顺序进行比较。
- strncmp第三个参数指定查找前几个字符。
-
strcpy()和strncpy()函数
-
sprintf()函数
- 1
-
其他字符函数