上节我们学习了遍历的相关操作:冒泡与选择,以及二维整形数组和一维字符数组;这一节我们继续深入学习,包括输入输出函数(scanf/gets/printf)、字符串长度获取(strlen)、复制函数(strcpy)、拼接函数(strcat)和比较函数(strcmp)

字符串常用相关操作与函数

一、输入scanf()、gets()    输出printf()

char str[10]="hello";

printf("%s\n",str);  //全部打印出来

scanf("%s",str);  //   char []    char-->str已经是内存编号

gets();  //在接受字符串的时候可以接受空格,遇到\n表示输入结束,但对于scanf()来说 空格,Tab,回车都是结束的一个标志

二、获得字符串长度函数  -->strlen()  有效字符串长度

strlen函数使用时要包头文件#include<string.h>

char str[50]="hello";  字符串长度  5  从第一个字符开始计数  到字符串结束标志\0之前

注意区分:sizeof(str)  sizeof(基类型)*元素个数  -->用%lu打出来

#include<stdio.h>
#include<string.h>
int main()
{
    char str[50]={0};
	printf("input 49 char:");
	scanf("%s",str);
    int len = 0;

	int i=0;
	while(1)
	{
		if('\0' != str[i])
		{
			len++;
		}
		else
		{
			break;
		}
		i++;
	}
    printf("sizeof() is %lu\n",sizeof(str));
    printf("strlen %d\n",len);

	return 0;
}

三、复制字符数组  strcpy(目标数组名,原数组名)

使用复制函数

#include<stdio.h>
#include<string.h>
int main()
{
	char src_str[100]={0};
	char dst_str[100]={0};

	/*error
	 dst_str=src_str;
	 dst_str="hello";
	 */

	printf("input str:");
	gets(src_str);
	strcpy(dst_str,src_str);
	printf("src_str:%s\n",src_str);
	printf("dst_str:%s\n",dst_str);

	return 0;
}

复制函数的思想:如果不使用复制函数怎么实现?

从源字符串中取一个字符,向目标字符串中写入一个字符,依次执行这个动作,当字符为\0的时候结束循环,最后在目标字符串中加入结束标志\0

方法一:

int i=0;
int len=strlen(src);
for(i=0;i<len;i++)
{
    dst[i]=src[i];
}
dst[i]='\0';

方法二:

while('\0'!=src[i])
{
    dst[i]=src[i];
    i++;
}
dst[i]='\0';

方法三:

while(dst[i]=src[i])
{
    i++;
}

四、字符串的拼接    stract(前,后)-->string concat

注意:在字符串拼接中,str1需要有足够大的空间

否则程序会出现段错误,str1,str2的内存空间会被意外修改

使用stract( , )拼接函数

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[100]={0};
	char str2[10]={0};
	printf("输入第一个字符串\n");
	gets(str1);
	printf("输入第二个字符串\n");
	gets(str2);

	stract(str1," ");
	stract(str1,str2);
	printf("str1:%s\n",str1);
	return 0;
}

拼接函数的思想:如果不使用函数怎么实现?

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[100]={0};
	char str2[10]={0};
	printf("输入第一个字符串\n");
	gets(str1);
	printf("输入第二个字符串\n");
	gets(str2);

	int i=0,j=0;
	while('\0'!=str1[i])
	{
		i++;
	}
	while(str1[i]=str2[j])
	{
		i++;
		j++;
	}
	printf("str1:%s\n",str1);
	return 0;
}

五、字符串比较    strcmp -->string compare    比较字符串中的内容

使用strcmp( , )函数

int strcmp(const char *s1, const char *s2); // 按照字典规则 , a(前)-z(后)

参数 :

s1, 需要被比较的字符串1
s2 ,需要被比较的字符串2

返回值:
==0 s1 与s2 内容 相同
>0 内容不一样 ,不一样处对应的字符,s1[i] -s2[i] >0
<0 内容不一样 ,不一样处对应的字符,s1[i] -s2[i] <0

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[10]="hello";
	char str2[10]="hello";

	if(0==strcmp(str1,str2))
	{
		printf("一样\n");
	}
	else
	{
		printf("不一样\n");
	}
	return 0;
}

比较函数的思想:如果不使用比较函数怎么实现?

使用1个下标,如果str1[i],str2[i],相同就继续比较下一个。如果不同str1[i]-str2[i];差就是比较的结果

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[10]="hello";
	char str2[10]="hello";

	int i=0,ret=0;
	while((str1[i]==str2[i] && (str1[i]=='\0')
	{
		i++;	
	}
	ret = str1[i]-str2[i];
	if(0==ret)
	{
		printf("same\n");
	}
	else
	{
	    printf("no same\n");
	}

	return 0;
}

二维字符数组    定义与操作

二维字符数组是有多个一维字符数组组成,可以存储多个字符串的数据

#include<stdio.h>
#include<string.h>
int main()
{
	//初始化
	char str1[3][50]={"how","are","you"};
	char str2[3][50]={{"how"},{"are"},{"you"}};

	char str3[3][50]={0};  //常用,剩余全部补0
	char strs4[3][50]={{0}};

	char str5[][50]={"how","are","you"};  //一维数可以省略
	
	//访问,读
	printf("%s\n",str3[0]);// %s-->char []

	int i=0;
	int line=sizeof(str1)/sizeof(str1[0]); //150/50
	for(i=0;i<line;i++)
	{
		printf("str1[i]:%s\n",str1[i]);
	}

	//访问,写
	strcpy(str1[0],"aaa");
	strcat(str1[2],"!!!");
	printf("修改后:");
	for(i=0;i<line;i++)
	{
         printf("str1[i]:%s\n",str1[i]);
	}
	return 0;
}

总结

本章的的学习快要结束啦,重点学习:

  1. 数组定义,数组的初始化,数组的访问。数组三要素。
  2. 一维字符数组 ,定义,初始化,访问。
  3. 系统统计的相关操作函数 strlen ,strcpy,strcat ,strcmp
  4. 要求,熟练调用c库字符( strlen ,strcpy,strcat ,strcmp)串相关函数。
  5. 手撕代码 ,strlen ,strcpy,strcat ,strcmp, 排序
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐