一、一维字符数组
【1】字符串函数族的函数
i)strlen
ii)strcpy
iii)strcat
以上详见DAY6
iv)strcmp
两个字符串比较
原型: int strcmp(const char *s1, const char *s2);
功能: 比较两个字符串的大小
参数: 字符串的地址
结果:
s1>s2: 正数, s1-s2, ascii的值
s1<s2: 负数, s1-s2, ascii的值
s1=s2: 0
执行逻辑:
按位比较,碰见不同的位就结束函数返回结果,如果每一位都相同,遇到'\0'结束函数,返回结果。
练习:
1、尝试实现strcmp函数
#include <stdio.h>
int main(int argc, const char *argv[])
{
char str[20] = "hell";
char str1[10] = "h";
int i = 0,ret;
//如果两个字符串相等并且都没有走到'\0'的时候向后走
while(str[i]==str1[i]&&str[i]!='\0')
{
i++;
}
//如果不满足条件说明两个字符不相等,说明有两个或者是有一个走到的'\0',
//计算差值 结束判断
ret = str[i]-str1[i];
printf("%d\n",ret);
return 0;
}
方法2:
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[20] = "hell";
char str1[10] = "hell";
int i = 0,ret;
//通过判断字符串长度,实现strcmp
while(str1[i]) //如果str1没有走到'\0'
{
if(str[i]!=str1[i])
{
ret = str[i]-str1[i];
break;
}
i++;
}
if(str1[i]=='\0') //判断上面的while循环是否正常退出
{
ret=str[i]-str1[i];
}
printf("%d\n",ret);
return 0;
}
2、终端输入带空格的字符串,实现字符串的逆置/一维字符数组的逆置
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[30] = "hello"; //数组的不完全初始化
gets(str);
int len = strlen(str); //求出str的真实长度
//<==>int arr[5]里面的5
int i = 0;
char temp;
while(i<len/2)
{
temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
i++;
}
puts(str);
return 0;
}
终端输入带空格的字符串,求单词的个数
#include <stdio.h>
int main(int argc, const char *argv[])
{
char str[100]=""; //把str中的每一个字节都初始化'\0'
gets(str);
int count = 0,i=0;
//遍历字符串
while(str[i]) //n次
{
//如果第i位是空格,第i+1位不是空格,说明是一个单词
if(str[i]==' '&&str[i+1]!=' '&&str[i+1]!='\0')
{
count++;
}
i++;
}
//把字符串起始位置就是单词的情况包括进来
if(str[0]!=' ')
{
count++;
}
printf("%d\n",count);
return 0;
}
终端输入带空格的字符串,删除字符串中的空格,要求使用一个数组
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[100]=""; //把str中的每一个字节都初始化'\0'
gets(str);
int i,j;
int len = strlen(str);
//第一个for循环,遍历字符串本身包括结尾的'\0'
for(i=0;i<=len;i++)
{
//如果字符串中遇到空格了
if(str[i]==' ')
{
//循环把空格后面的字符向前覆盖
for(j=i;j<len;j++)
{
str[j]=str[j+1];
}
//i--因为,从后面赋过来的字符串也可能是空格
i--;
//已经被覆盖了,长度改变了
len--;
}
}
/*char str1[] = "hello ";
puts(str1);*/
puts(str);
return 0;
}
二、二维数组
整形二维数组
【1】定义
存储类型 数据类型[行数][列数];
【2】初始化和赋值
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[2][3]={1,2,3,4,5,6};
//定义了一个二维数组arr能存6个整形数据,并完全初始化
int arr1[2][3]={1,2,3,4};
//定义了一个二维数组arr1能存6个整形数据,不完全初始化,未初始化的部分全部为0
int arr2[2][3]={{1,2,3},{2,4,5}};
//定义了一个二维数组arr2能存6个整形数据,以行为单位的完全初始化
int arr3[2][3]={{1,2},{1,2}};
//定义了一个二维数组arr3能存6个整形数据,以行为单位的不完全初始化,未初始化的部分为0
int arr4[][3]={1,2,3,4,5};
//省略行数的初始化,可以的,根据初始化列表和列数来分配数组的空间
//1,2,3存在二维数组的第一行,4,5存在二维数组的第二行
int arr5[2][3]={0};
//把二维数组中的每个元素都初始化为0 //
int arr5[3][] = {1,2,3,};
//error,不可以省略列数的初始化
printf("%ld\n",sizeof(arr4));
//二维数组中元素的个数
int count = sizeof(arr)/sizeof(arr[0][0]);
printf("%d\n",count);
return 0;
}
【3】二维数组的大小
行数*列数*元素的大小
二维数组中元素的个数:行数*列数
【4】二维数组中元素的访问
数组名[行标][列标];
由于数组中下标是从0开始的,所以最大行标是:行数-1
最大列标:列数-1
int arr[2][3]={1,2,3,4,5,6};
arr[0][0];
练习:
1、使用for循环,实现二维数组中元素的输出,以及元素的地址。
#include <stdio.h> int main(int argc, const char *argv[]) { int arr[2][3]={12,3,4,5,6,78}; int i,j; //外层循环,循环二维数组的每一行 for(i=0;i<2;i++) { //内层循环,循环二维数组的每一列 for(j=0;j<3;j++) { printf("%d\t%p\n",arr[i][j],&arr[i][j]); } } return 0; }
2、终端输入二维数组中的元素,求二维数组中最大值,及其行标列标
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[2][3];
int i,j;
//循环输入数组中元素
for(i=0;i<2;i++)
{
for (j=0;j<3;j++)
{
scanf("%d",&arr[i][j]);
}
}
//求最大值
int max = arr[0][0];
for(i=0;i<2;i++)
{
for (j=0;j<3;j++)
{
if(arr[i][j]>max)
{
max = arr[i][j];
}
}
}
printf("最大值%d\n",max);
return 0;
}
作业:
1.终端输入二维数组中的元素,求二维数组中第二大值,及其行标列标
2.整理思维导图
3.给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。要求:不许使用数下标的方式完成。
4.输出杨辉三角