C语言基础学习笔记——字符串及字符串操作函数

字符串的定义:字符串是位于双引号中的字符序列,在内存中以’\0’结束,所占字节比实际多一个。
例如:字符串"Hello"在内存中的存储方式为:
     Hello \0  //以‘0’作为字符串结束的标志
注意:可以把一个字符常量赋值给一个字符变量,但不能把一个字符串常量赋值给字符变量。如:char ch = ‘A’;(正确)   但是char ch = “A”;(错误)。C语言中没有字符串变量,可以使用字符数组来存放字符串。

字符串的初始化:字符数组中,字符串存放在相邻的存储单元,每个字符占一个单元。
例如:

char name1[]={'C','h','i','n','a'};
char name2[]={"China"};     //多一个字节'\0'
//即sizeof(name1)=5,sizeof(name2)=6

清空字符串,字符串初始化函数:
可以用上面这种方式给字符数组初始化,也可以用函数memset()给数组初始化,用memset()时,需要包含头文件#include

memset(数组名,要清理内存使用的数据,清理的字节数);
例如:把字符数组name1清0,一个清10个字节

memset(name1,'\0',10);

定义与初始化
1.定义字符数组时,应确保数组长度比字符串长度至少多一
2.未被使用的元素均被自动初始化为’\0’(仅限xcode编译器)
3.被初始化的字符数组可以省略长度,数组的长度是字符串的长度加1

char szName1[]="ABCD";  //数组长度为5,有一个'\0'
char szName2[]="";  //长度为1
char szName[4]="ABCD";  //错误,无法保存'\0'

求所存字符串长度
求字符串数组内存大小,可以用sizeof(),它的返回值是一个整型数据

char str[10]="BeiJing";
sizeof(str);  //求字符串数组的内存大小,结果为10

求字符串长度,用strlen(),它的返回值是一个整型数据

int n;
char str[10]="BeiJing";
n = strlen(str);  //结果为7,计算时遇到'\0'就结束

用c代码实现strlen()函数的功能:

#include
#include
int main()
{
	char str[10] = "beijing";
	char temp = str[0];
	int index = 0;
	while (temp != '\0')
	{
		temp = str[++index];
	}
	printf("length=%d\n",index);
	system("pause");
	return 0;
}

字符输入输出操作
输入:char temp = getchar();
输出:putchar();

字符串的格式化输入
可以用scanf()函数接收字符串,但它不接收空格,遇到回车或空格都会结束输入。格式:
scanf("%s",数组名); //str前不用再加&符号,因为数组名就是地址
注:可能因为编译器不同,scanf输入会遇到问题,我在vs2013上用scanf_s输入字符串都不行,只能用gets_s();

字符串的格式化输出
可以用printf()输出字符串,遇到’\0’结束。格式:
printf("%s",数组名);

char str[10]="ABC";
printf("%s",str);  //输出ABC

char str[10]="ABC";
str[1]='\0';  //相当于把B改成了\0
printf("%s",str);  //输出A

char str[4]="ABC";
str[3]='D';  //把最后一个\0字符改成了'D'
printf("%s",str);  //错误,没有\0

字符串的输入输出函数
输入:==gets(字符数组名);==输入时可以输入空格,以回车结束。
输出:==puts(字符数组名||字符串常量);==遍历打印字符串,遇到’\0’结束

字符串操作函数
1.内存赋值函数:memset()
用法:

//①
memset(szName,'\0',100);  //把数组szName前100位元素清0
//②
memset(szName,'A',5);  //把数组前5位元素替换为'A'
//③
memset(szName+5,'A',5);  //把数组下标为5的元素开始往后5个元素替换成'A',包括5

2.字符串长度函数:strlen()
①检查’\0’,没遇到就加1,遇到就结束;
②返回值的结果里不包含\0

char str[10]="1234";
int nLen1=strlen(str);  //结果为4,求的字符串长度
int nLen2=sizeof(str);  //结果为10,求的数组内存大小

3.字符串比较函数:strcmp()
用法:

//①
strcmp(s1,s2);
int result =strcmp(s1,s2);  //接收比较结果
//②
strcmp(s,"123");
//③
strcmp("123",s);

原理:比较相同位置上的ASCII码值的大小(常用于比较字符串是否相等),若两个字符串相等,则返回0值;若字符串1大于字符串2,则返回正数,否则返回负数。

4.字符串复制函数:strcpy()
格式:
strcpy(字符数组1,字符数组2);
strcpy(字符数组1,字符串常量);
前面数组为要拷贝的,后面为被拷贝的(一般为只读),要保证前面的数组内存足够大,复制时遇到’\0’结束,之后的不再复制。

5.字符串超级复制函数:strncpy()
格式:
strncpy(字符数组1,字符数组2,要拷贝的元素个数);

//①
strncpy(szTemp+x,"ABC",3);  //表示从数组下标为x的元素开始,往后按顺序替换成ABC
//②
strncpy(str,"12345",2);  //只复制“12345”的前两个字符给str
//③
strncpy(strA+x,strB+y,z);  //从strB下标为y之后的z个字符,复制到strA下标为x的字符后面(包括x和y的元素)

注:不拷贝’\0’,strcpy不检查目标字符串的大小,如果目标字符串内存不足时,会导致崩溃。

6.字符串拼接函数:strcat()
格式:
strcat(字符数组1,字符数组2);
表示把字符数组2中的字符串连接到字符数组1中的字符后面,并且删除字符数组1中末尾原来的结束标志’\0’
加强版:strncat()
格式:
strncat(字符数组1,字符数组2,要拼接的元素个数);
注:只能从字符数组1后面进行拼接。

你可能感兴趣的:(C学习笔记,C语言基础,字符串,字符串操作函数,strlen/sizeof)