------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、字符串的基本概念和定义
1、字符串的概念
字符串是位于双引号中的字符序列。 在内存中以“\0”结束,所占字节比实际多一个
注意:
1.可以把一个字符常量赋给一个字符变量,但不能把字符串常量赋给字符变量
2.C语言中没有字符串变量,可以用字符数组来存放字符串
Printf("hello world!");
Char ch[10]="ab";
2、字符数组定义
形式与前面介绍的数值数组相同。
char 数组名[常量表达式]
字符数组也可以是二维或多维数组。
char 数组名[常量表达式1][常量表达式2]
注意:定义字符数组时,应确保数组长度比字符串长度至少多1
二、字符数组初始化和引用
1、字符数组初始化
1) 定义的同时进行初始化
第一种初始化方法:
字符数组也允许在定义时作初始化赋值。
当对全体元素赋初值时也可以省去长度说明。
第二种初始化方法:
char c4[10]={"abc"}
//定义了一个字符串数组c4 长度是10,初始化4个字符
'a'->c4[0];
'b'->c4[1];
'c'->c4[2];
'\0'->c4[3];
//c4存储了一个字符串
第三种初始化方法:
char c5[5]="ab";
char c6[]="afdsafas";
2) 先定义再初始化:
char c7[3];
c7[0] = 'a';
c7[1] = 'b';
c7[2] = 'c';
注意:未被使用的元素均被自动初始化为0
2、字符数组引用
字符数组和普通数组一样,也是通过下标引用。
三、以字符串的形式输入和输出
1、字符数组的输入输出
使用的格式字符串为“%s”,表示输入、输出的是一个字符串。
1)字符串的输出
在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
%s 从给定的地址开始,输出字符直到遇到\0结束
2)字符串的输入
char ch[10];
scanf("%s",ch);
数组长度为100,因此输入的字符串长度必须小于100,以留出一个字节用于存放字符串结束 标志`\0`。 应该说明的时,对一个字符数组,如果不做初始化赋值,则必须说明数组长度,还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段 存放含空格的串。程序可改写如下:
char st1[6],st2[6],st3[6],st4[6];
printf("input string:");
scanf("%s%s%s%s",st1,st2,st3,st4);
printf("your string: %s %s %s %s\n",st1,st2,st3,st4);
这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
//1、%s输出字符串
//保存字符串
char str[]="asdafasdft";
printf("%ld\n",sizeof(str));
//str[0] i
//str[1] t
//%c,我们要查看的是一个字符串,每次打印的事一个字符,这个显然不方便
// for (int i=0; i<10; i++) {
// printf("%c",str[i]);
// }
//用%s输出一个字符串
//从给定的地址开始,一直输出字符,直到遇到\0就停止了
//str[0] ----> i
printf("%s\n",str);
printf("%s\n",&str[0]);
//&str[3] ----> ast
printf("%s\n",&str[3]);
//把一个字符数组,用%s进行输出
char ch[10]={'a','b','c','d','\0'};
printf("%s\n",ch);
//2、%s接收键盘上输入的一个字符串
char str3[10]; //
//从键盘上接收一个字符串,保存在以str为首地址的字符数组中
scanf("%s",str3);
printf("---->%s\n",str3); //把字符数组,以%s的格式输出
//注意点:
//1、如果以%s格式进行输入的话,注意空格问题
//如果输入的字符串有空格,则空格之后的字符无法被接收保存
//(以%s的格式输入,scanf遇到了空格,就结束了)
//2、输入的字符串的长度要小于数组的长度
return 0;
}<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span></span>
四、字符串结束符使用
1、字符串结束符
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量 时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束 符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组 的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。
2、不使用或者不当使用结束符造成的问题
1)字符数组初始化时没有使用 '\0'
可写为:
char c[]={"C program"};
或去掉{}写为:
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定 数组的长度, 而由系统自行处理。
2)不当的使用 '\0'
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义了一个字符串 abc
//char str[]="abc";
//实际上存储了
// str[0] a
// str[1] b
// str[2] c
// str[3] \0
//printf("%ld\n",sizeof(str)); // 3 4?
//存的是字符,可以以%s输出
char ch[]={'a','\0','c'};
char ch1[]={'x','y','z'};
printf("%s\n",ch1); //xyz
char str2[]="asfasdfa\0sdfasdf";
printf("%s\n",str2);
return 0;
}</span>
五、字符数组和普通数组区别
实际上,字符数组和普通数组一样,没有本质区别。
请大家注意数组类型的含义:数据类型指的是数组所包含的元素的类型,而不是数组名的类型, 数组名永远是一个指针,指向第一个元素的地址,即数组首地址
1)字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。
2)scanf() 和 printf() 函数有一种格式化字符串 %s 可以用来整体输入输出字符数组,但是没有特定的格式支持 int 数组整体数组输出。
3)字符数组 ,初始化 char str[]="aab";
整形数组,初始化不能去掉大括号
六、字符串处理函数
C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转 换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。
用于输入输出的字符串函数,在使用前应包含头文件"stdio.h", 使用其它字符串函数则应包含头文件"string.h"。
1、字符串输出函数 puts
格式: puts(字符数组名)
功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。
从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由 printf函数取代。当需要按一定格式输出时,通常使用printf函数。
2、字符串输入函数 gets
格式: gets (字符数组名)
功能:从标准输入设备键盘上输入一个字符串。
本函数得到一个函数值,即为该字符数组的首地址。 可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字 符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
3、字符串连接函数 strcat
格式: strcat(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字符数组1的首地址。
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足 够的长度,否则不能全部装入被连接的字符串。
<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
char str[]="abc";
printf("%s\n",str);
//puts(字符数组地址);
//1)puts函数可以自动换行吗? 可以
//2)也可以不是数组的首地址,可以是元素的地址
//3)必须是字符数组
//4) 不可以格式化输出
puts(str);
char str1[10];
//使用gets会给出一个警告
//1)warning: this program uses gets(), which is unsafe.
//2)不安全:数组长度是100,但是如果你输入了120个字符,存在越界问题
//3)使用gets可以接收空格
// gets(str1);
// puts(str1);
//字符串的函数
//strcat 函数介绍,使用该函数必须要引入头文件
//1)格式:strcat(oldStr,newStr);
//2) oldStr的长度要足够到,只要能够保存下oldStr+newStr
//3) newStr 把oldStr的最后一个字符\0给覆盖了
char str2[100]="w";
char str3[]="itcast!";
strcat(str2, str3);
puts(str2);
puts(str3);
printf("%p\n",&str2[1]);
printf("%p\n",str3);
return 0;
}</span><span style="font-size:12px; font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>
4、字符串拷贝函数strcpy
格式: strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。
5、字符串比较函数strcmp
格式: strcmp(字符数组名1,字符数组名2)
比较规则:
对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果。
6、测字符串长度函数strlen
格式: strlen(字符数组名)
功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。