字符串的学习与应用

1.字符串与字符数组

字符:用单引号包括一个字符,如:"a","1"

字符数组:字符类型的数组,如:char arr[10];

字符串:用双引号包括字符序列,可以是0个或者多个字符序列,如:"abcd","1234ab"

注意:字符串有一个隐藏的"\0"作为结尾标记,在定义数组时注意长度问题

注意:如果字符数组包含"\0"那么它也是字符串,如果字符数组不包含”\0"它就不是字符串

int main()
{
	
	char str1[10]; //字符数组,不是字符串
	char str2[5] = { 'a','b','c','d','e' };//字符数组,不是字符串
	//char str3[5] = { 'a','b','c','d','e','f'};//错误
	char str4[] = { 'a','b','c','d','e' };//自动推导,能保存同时最节约,//字符数组,不是字符串
	char str5[5] = { 'a' };//后面4个0,//字符数组,是字符串
	//输出str4(把它当作一个普通的数组,利用循环处理)
	 //for (int i = 0; i < sizeof(str4) / sizeof(str4[0]); i++)
	 //  printf("%c",str4[i]);//输出一个字符
	
	 //和普通数组不同的地方
	char str6[5] = { "abcd" }; //字符数组,是字符串
	char str7[5] = "abcd"; //字符数组,是字符串
	//char str8[5] = "abcde";//错误
	const char* str9 = "hello world";//不是字符数组,是字符串,字符串常量

	printf("%s\n",str1);//不是字符串,输出出错
	printf("%s\n", str2);//不是字符串,输出出错
	printf("%s\n", str4);//不是字符串,输出出错
	printf("%s\n", str5);//是字符串
	printf("%s\n", str6);//是字符串
	printf("%s\n", str7);//是字符串
	printf("%s\n", str9);//是字符串
	return 0;
}

 2.   0在C语言中的表现

0:0,'\0',false,NULL都是0

int main()
{
    printf("%d,%d,%d,%d\n",0,'\0',false,NULL);
    return 0;
}

 程序执行如下:

 3.字符串的赋值

main()
{
    char str1[7];
	char str2[10] = "abcde";
	char str3[10] = "xyz";

	int i;
	//把str2复制给str1
	//str1 = str2 ;//错误的,数组不能整体复制
	//for(int i=0;i<10;i++);//这种可能越界,不好,最好应该使用'\0'判断结尾
	for (i = 0; str2[i] != '\0'; i++)
	{
		str1[i] = str2[i];
	}
	str1[i] = '\0';
	//输出str1的内容
	printf("%s\n", str1);

	//把str3的内容连接在str2的后面
	//找到str2的尾巴,然后把str3的内容复制到str2的尾巴后处
	for (i = 0; str2[i] != '\0'; i++)
	{
		//空语言,目的就是找到放'\0'的str2数组
	}
	for (int j = 0; str3[j] != '\0'; j++, i++)
	{
		str2[i] = str3[j];
	}
	str2[i] = '\0';
	printf("str2=%s\n", str2);

	//通过str2[3] = '\0'; //将str2数组的长度变为3,因此我们可以通过'\0'作为条件找到字符数组长度
	for (i = 0; str2[i] != '\0'; i++)
	{
		//空
	}
	printf("%d\n", i);
    
    return 0;
}

程序执行如下:

4.sizeof和strlen的区别

sizeof:求后面内容的字节数

strlen:求字符串的有效长度,不包含'\0'

int main()
{
    //printf("%llu\n",strlen(str1));//%u:输出无符号int
	char str1[100] = "abcde";
	char str2[] = "abcde";
	char str3[100] = "abcd\0ef";
	char str4[] = "abcd\0ef";
	printf("%u,%u\n", sizeof(str1), strlen(str1));//100,5
	printf("%u,%u\n", sizeof(str2), strlen(str2));//6,5
	printf("%u,%u\n", sizeof(str3), strlen(str3));//100,4
	printf("%u,%u\n", sizeof(str4), strlen(str4));//8,4
	printf("%u\n", sizeof(int));//4
	//printf("%llu\n",strlen(int));//错误
	printf("%u\n", sizeof(12.3));//8  ,double
	//printf("%llu\n",strlen(12.3));//错误
    return 0;
}

5.字符串库函数:字符串是一个集合必须使用相应的函数进行处理

strcpy:字符串拷贝,注意要求目标字符数组的容量一点更要足够,否则会越界

strcat:字符串连结,把后面的字符串连接到前面的字符串的后面,注意要求目标字符数组的容量一定要足够,否则会越界

strlen:字符串的长度,字符的数量不包括"\0",例如:"abcd" --->3

strcmp:字符串比较,注意字符串不能用"<",">"或者"=="进行比较

strstr:在字符串1中查找字符串2,成功返回找到的地址,失败返回NULL

strcpy的使用

int main()
{
    char str1[100];
	char str2[] = "abcde";
	strcpy(str1, str2);//把str2的字符串拷贝到str1中
	printf("str1=%s\n", str1);
	strcpy(str1, "hello world");//str1原来的内容会被覆盖
	printf("str1=%s\n", str1);

	char str3[10];
	strcpy(str3, "hello world");//str3越界,strcpy:要求目标字符数组的容量一点要足够
	printf("str3=%s\n", str3);
    return 0;
}

strcat的使用

int main()
{
    char str1[100] = "xyz";
    char str2[] = "abcde";
    strcat(str1,str2);
    printf("str1=%s\n",str1);


 //常见的错误
 /*char str3[10];//str3不是字符串
    strcat(str3, str2);
 printf("str3=%s\n", str3);*/
 

 //char str4[] = "xyz"; //越界,str4的长度不够继续存放str2的内容
 //strcat(str4, str2);
 //printf("str4=%s\n", str4);
 //strcat("xyz","abcde");//错误,"xyz"是一个字符串常量,不允许修改
}

strlen的使用

int mian()
{
    char str1[] = "abcde";
	const char* str2 = "xyz";
	char str3[] = "abcd\0ef\nxyz";
	printf("%d,%d,%d\n", strlen(str1), strlen(str2), strlen(str3));
    
    return 0;
}

strcmp的比较使用

int main()
 {
     const char* str1 = "abc";
     //const char* str2 = "x";
     //const char* str2 = "abb";
     //const char* str2 = "abc";
     char str2[] = "xyz";
     int n1 = strcmp(str1,str2);
     if (n1 > 0)
     printf("%s > %s\n",str1,str2);
     else if(n1 == 0)
     printf("%s == %s\n", str1, str2);
     else
     printf("%s < %s\n", str1, str2);

     return 0;
}

strstr字符串查找的使用

int main()
{
    const char* str1 = "abcabcdabcde";
    const char* str2 = "abcd";
    const char *p = strstr(str1,str2);//返回第一个str2的指针地址
    if (p == NULL)
    printf("%s中没有%s\n",str1,str2);
    else
        printf("p=%s\n",p);
    p = strstr(p+1,str2);
    if (p == NULL)
        printf("%s中没有%s\n", str1, str2);
    else
        printf("p=%s\n", p);

    return 0;
}

 

 字符串常量和字符串数组

int main()
{
    //char* str1 = "hello world";//语法错误
	char str2[] = "hello world";//字符数组,字符串
	const char* str3 = "hello world";//字符串常量,str3是指针,在x86是4字节
	str2[0] = 'x';//可以
	//str3[0] = 'x';//语法错误
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值