今天学习了字符串的函数,这些函数很大程度上减少了我们代码的消耗,不用再多写循环去计算长度,比较大小也可以直接进行比较了。此外我们还在这些的基础上学习了二维的字符数组,其实二维字符数组跟一维没什么区别,完全可以按照一维的计算方式去计算二维数组。下面是今天的脑图:
一、字符串函数
课堂上有很多关于字符串函数的练习,我在这里列举一下,都是很简单的练习就不贴代码了。
1.strlen的练习:
计算变量的长度
计算常量的长度
使用非函数方法计算字符串长度
2.strcmp的练习:
定义3个字符串,计算最大值【两个参数都为变量】
输入一个字符串,【和常量进行比较】
使用非函数计算字符串比较
3.strcpy的练习:
实现两个字符串交换
两个变量实现拷贝
变量和常量实现拷贝
非函数实现拷贝
4.strcat的练习:
实现把str1连接到str2的后面,在把str2连接str3后面
实现把 "华清远见"连接到str的后面
使用非函数实现
二、二维字符数组
怎么定义我就不说了,脑图上有,二维字符数组唯一要注意的就是它的一行怎么表示,搞清楚这个就跟一维数组一样了。
练习题:
1.对二维数组冒泡冒泡
char a[5][50];
int i,j;
for(i=0;i<5;i++)
{
scanf("%s",a[i]);
}
//冒泡
int count=0;
char t[50];
for(i=1;i<5;i++)
{
count=0;//计算交换的次数
for(j=0;j<5-i;j++)
{
if(strcmp(a[j],a[j+1])<0)
{
strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
count++;
}
}
if(count==0)
break;
}
//输出
for(i=0;i<5;i++)
{
printf("%s\t",a[i]);
}
2.计算二维字符数组的最大字符串 strcmp
char a[3][20]={"dfsagdhf","rwtey","rtyu"};
int i;
char max[20]=""; //解决乱码
for(i=0;i<3;i++)
{
if(i==0) //第一次循环
strcpy(max,a[i]);
if(strcmp(max,a[i])<0)//if(max<a[i])
{
strcpy(max,a[i]);
}
}
printf("最大值是:%s\n",max);
3.计算二维字符数组的最长字符串strlen
char a[3][20]={"dfsagdhf","rwtey","rtyu"};
int i;
char max[20]=""; //解决乱码
for(i=0;i<3;i++)
{
if(i==0) //第一次循环
strcpy(max,a[i]);
if(strlen(max)<strlen(a[i]))//if(max<a[i])
{
strcpy(max,a[i]);
}
}
printf("最长值是:%s 长度是:%ld\n",max,strlen(max));
4.将m行n列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。
char a[3][5]={"asd","wert","tyuio"};
char str[20]="";
int k=0;
for(int i=0;i<5;i++)
{
for(int j=0;j<3;j++)
{
if(a[j][i]!='\0')
str[k++]=a[j][i];
}
}
printf("str=%s\n",str);
5.输入一个字符串key,查找key是否在二维数组中出现
char a[5][5]={"aaaa","aana","aaja","dddd","eeee"};
char key[]="aaaa";
int count=0,xb1,xb2;
for(int i=0;i<5;i++)
{
if(strcmp(a[i],key)==0)
{
count++;//计算key出现的次数
if(count==1)
xb2=i;
xb1=i;//2 4 5
}
}
if(count==0)
{
printf("不存在\n");
}
else if(count==1)
{
printf("在%d出\n",xb1);
}
else{
printf("第一次%d 最后一次:%d\n",xb2,xb1);
}
6.对二维字符数组每个字符串实现简单选择排序
char a[5][5]={"aaaa","aana","aaja","dddd","eeee"};
int i,j,mini;
char t[5]="";
for(i=0;i<5-1;i++)
{
mini=i;
for(j=i+1;j<5;j++)
{
if(strcmp(a[mini],a[j])>0)
{
mini=j;
}
}
if(mini!=i)//交换
{
strcpy(t,a[mini]);
strcpy(a[mini],a[i]);
strcpy(a[i],t);
}
}
for(i=0;i<5;i++)
{
printf("%s\t",a[i]);
}
以上练习题都需要活用字符串函数,有了这些函数再做这些题就很简单了。
day6作业
1.实现字符串逆置
例如:char a[]=”hello my student”
输出:student my hello
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char a[] = "hello my students";
int n = strlen(a);
int left = 0;
int right = n - 1;
while(left < right){
char mid[3] = "\0";
mid[0] = a[left];
a[left] = a[right];
a[right] = mid[0];
left ++;
right --;
}
int left2 = 0;
int right2 = 0;
int type = 0;
for(int i = 0; i < n; i ++){
if((a[i] == ' ' || i == n - 1) && type == 0){
right2 = i - 1;
int left3 = left2;
int right3 = right2;
if(i == n - 1){
right3 = i;
}
while(left3 < right3){
char mid2[3] = "\0";
mid2[0] = a[left3];
a[left3] = a[right3];
a[right3] = mid2[0];
left3 ++;
right3 --;
}
type = 1;
}
if(type == 1 && a[i] != ' '){
type = 0;
left2 = i;
}
}
puts(a);
return 0;
}
结果如下:
2.使用非函数方法实现字符串比较
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char a[10] = "\0";
char b[10] = "\0";
printf("请输入2个字符串\n");
scanf("%s %s",a,b);
getchar();
int na = strlen(a);
int nb = strlen(b);
if(na != nb){
printf("2个字符串不相同\n");
return 0;
}
for(int i = 0; i < na ; i ++){
if(a[i] != b[i]){
printf("2个字符串不相同\n");
return 0;
}
}
printf("2个字符串相同\n");
return 0;
}
结果如下:
3.使用非函数方法实现字符串连接
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char a[20] = "\0";
char b[20] = "\0";
printf("输入2个字符串\n");
scanf("%s %s",a,b);
int na = strlen(a);
int nb = strlen(b);
for(int i = 0; i < nb; i ++){
a[na ++] = b[i];
}
printf("连接后的结果是\n%s\n",a);
return 0;
}
结果如下:
4.打印m行n列的杨辉三角
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int a[10][10];
int n2 = 10;
int n,m;
printf("请输入要打印几行几列\n");
scanf("%d %d",&m,&n);
for(int i = 0; i < m; i ++){
for(int w = 0; w < n2; w ++){
printf(" ");
}
for(int j = 0; j < n; j ++){
if(j > i){
break;
}
if(i == j || j == 0){
a[i][j] = 1;
printf("%4d",a[i][j]);
}else{
a[i][j] = a[i-1][j] + a[i-1][j-1];
printf("%4d",a[i][j]);
}
}
n2 --;
printf("\n");
}
return 0;
}
结果如下: