目录
一、计算字符串实际元素个数
strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际元素个数,不包括'\0'
参数:字符数组首地址
返回值:字符串实际元素个数
char a[33] = "hello";
int num = strlen(a);
printf("%d\n",num); //5
例题:将一串字符串进行倒置 a[32] = "hello";//olleh
strlen 与 sizeof 的区别
- sizeof是关键字,strlen是函数
- sizeof计算元素实际开辟的空间大小,strlen计算字符串实际元素的个数;
- sizeof计算包括'\0',strlen不包括'\0'
例:char a[ ]="hello"; //sizeof(a)==6,strlen(a)==5
二、字符数组输入输出
1. for
for(int i=0;i<5;i++)
scanf("%c",&ch[i]);
for(int i=0;i<5;i++)
printf("%c",ch[i]);
2. %s
char ch[33]={0};
scanf("%s",ch);
printf("%s\n",ch);
//scanf 默认遇到空格或回车赋值结束,如果想保留空格,可以:
scanf("%[^\n]",ch);
3. gets puts
gets
char *gets(char *s);
功能:终端输入字符串
参数:字符数组首地址
返回值:字符数组首地址
puts
int puts(const char *s);
功能:终端输出字符串
参数:字符数组首地址
返回值:字符个数
char s[33]={};
gets(s);
puts(s);
三、冒泡排序
例:5个数,比较4轮。
int a[5]={5,4,3,2,1}; //从小到大
排序思想:相邻的两个数进行比较 (两两比较),如果前者大则交换位置
第一轮:外层循环变量j j=0
5 4进行比较:---》4 5 3 2 1
5 3 进行比较:---》4 3 5 2 1
5 2 进行比较:---》4 3 2 5 1
5 1 进行比较:---》4 3 2 1 5 ------>最大值位置正确 4次 4-0
第2轮:j=1
4 3 进行比较:---》3 4 2 1 5
4 2 进行比较:---》3 2 4 1 5
4 1 进行比较:---》3 2 1 4 5 ---》3 --- 4-1
第3轮:j=2
3 2 进行比较:---》2 3 1 4 5
3 1 进行比较:---》2 1 3 4 5 ----》2 --- 4-2
第4轮:j=3
2 1进行比较:---》1 2 3 4 5 ---》1 --- 4-3
int a[5]={5,4,3,2,1},temp;
for(int i=0;i<5-1;i++) //轮数:5个数比较4轮
{
for(int j=0;j<5-1-i;j++) //每一轮比较的次数
{
if(a[j]>a[j+1]) //确定了最大或最小值之后,该值被固定到最右边,之后不参与比较,
{ //所以随着循环的执行,参与比较的元素越来越少,它的索引越来越低
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<5;i++)
printf("%d ",a[i]);
四、选择排序
假设第一个元素最小,和后边每一个进行比较,比较过程中遇到了更小值,暂存下标位置,直到一轮比较结束,再把最小值和最左边位置交换;
int a[5]={5,4,3,2,1},m,temp;
for(int i=0;i<5-1;i++) //轮数
{
m=i; //m:最小元素下标 ,默认是参与比较的元素中最左边位置
for(int j=i+1;j<5;j++) //获取剩下的所有元素
{
if(a[m]>a[j])
{
m=j; //在循环内部,暂存最小元素下标
}
} //一轮循环结束,交换位置
//交换
if(m!=i) //当最小元素下标==要交换位置的下标,不需要交换
{
temp=a[m];
a[m]=a[i];
a[i]=temp;
}
}
for(int i=0;i<5;i++)
printf("%d ",a[i]); //输出排序后的数组
五、二维数组
格式:数据类型 数组名[行数][列数];
int a[2][3] = {1,2,3,4,5,6};
访问:数组名[行下标][列下标] 下标从0开始
a[0][0] | a[0][1] | a[0][2] |
a[1][0] | a[1][1] | a[1][2] |
注意:定义二维数组时,可以省略行数,不能省略列数
inta[2][ ]={2,3,4,5,6,7}; //错误无法确定具体两行几列
inta[ ][3]={2,3,4,5,6,7};
数组名
是第一行的首地址,是个行地址
a: 第一行首地址
a+1:第二行首地址
int a[2][3]={2,3,4,5,6,7};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
初始化
完全初始化
int a[2][3]={2,3,4,5,6,7};
int arr[2][3]={{2,3,4},{5,6,7}}; //按行赋值
部分初始化
未初始化部分,值为0
int a[2][3]={2,3};//230000
int arr[2][3]={{2},{5,6,7}};//200567
未初始化
值为随机值需要单独赋值
内存分配
int a[2][3] = { 2,3,4,5,6,7};
a[0]:第一行第一列的地址
a[0]+1:第一行第二列的地址
地址 | 元素 | |||
a[0] | &a[0][0] | a | 2 | a[0][0] |
a[0]+1 | &a[0][1] | 3 | a[0][1] | |
a[0]+2 | &a[0][2] | 4 | a[0][2] | |
a[1] | &a[1][0] | a+1 | 5 | a[1][0] |
a[1]+1 | &a[1][1] | 6 | a[1][1] | |
a[1]+2 | &a[1][2] | 7 | a[1][2] |
int a[2][3]={2,3,4,5,6,7};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
printf("%d\n",sizeof(a));
printf("%p\n",a[0]);
printf("%p\n",a[0]+1);
遍历数组
int a[2][3]={};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
scanf("%d",&a[i][j]);
}
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
printf("%d\n",a[i][j]);
}