嵌入式学习日志_Day10:C语言字符串操作全解析
摘要:本节讲解字符串常用操作与函数,包括输入输出函数(scanf/gets/printf)、字符串长度获取(strlen)、复制函数(strcpy)、拼接函数(strcat)和比较函数(strcmp)。重点介绍了这些函数的实现原理及手动实现方法,并讲解了二维字符数组的初始化、访问和修改。
上节我们学习了遍历的相关操作:冒泡与选择,以及二维整形数组和一维字符数组;这一节我们继续深入学习,包括输入输出函数(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;
}
总结
本章的的学习快要结束啦,重点学习:
- 数组定义,数组的初始化,数组的访问。数组三要素。
- 一维字符数组 ,定义,初始化,访问。
- 系统统计的相关操作函数 strlen ,strcpy,strcat ,strcmp
- 要求,熟练调用c库字符( strlen ,strcpy,strcat ,strcmp)串相关函数。
- 手撕代码 ,strlen ,strcpy,strcat ,strcmp, 排序
更多推荐
所有评论(0)