字符数组
本质是数组,只是数组的每个元素是字符
//定义一个数组 有5个元素 每个元素char
char ch[5];
//初始化:逐个字符初始化 不推荐
char str[6] = { 'h','e','l','l','o' }
//str[0] == 'h' 的ASCII值
//初始化:以字符串的形式 初始化
char str[6]="hello";
字符数组的遍历
逐个字符遍历 不推荐
#include<stdio.h>
void test08()
{
char str[6] = "hello";
//逐个字符遍历 不推荐
int i =0;
for(i=0;i<6;i++)
{
printf("%c",str);
}
printf("\n---------------------\n");
//字符数组 可以整理遍历 推荐
printf("%s\n",str);
}
int main(int argc,char *argv[])
{
test08();
return 0;
}
运行结果:
hello
---------------------
hello
Press any key to continue
重要:一维数组名 代表的是 数组的第0个元素的地址.必须记住!
#include<stdio.h>
void test09()
{
char str[6] = "hello";
//%p是十六进制输出地址
printf("第0个元素的地址:%p\n",&str[0]);
printf("数组名:%p\n",str);
}
int main(int argc,char *argv[])
{
test09();
return 0;
}
运行结果:
第0个元素的地址:0019FED4
数组名:0019FED4
Press any key to continue
逐个字符初始化 和 字符串初始化的区别
#include<stdio.h>
void test10()
{
char str1[]={'h','e','h','e'};//逐个字符初始化 系统不会添加'\0'
char str2[]="hehe";//以字符串初始化 系统会给字符串添加 '\0'
//空间大小
printf("sizeof(str1)=%d\n",sizeof(str1));//4字节
printf("sizeof(str2)=%d\n",sizeof(str2));//5字节
//%s输出的内容 从数组的第0个元素开始逐个元素输出 直到遇到'\0'结束
printf("str1 = ##%s##\n",str1);//访问到非法内存,输出不正常的乱码
printf("str2 = ##%s##\n",str2);
}
int main(int argc,char *argv[])
{
test10();
return 0;
}
运行结果:
sizeof(str1)=4
sizeof(str2)=5
str1 = ##hehe0##
str2 = ##hehe##
Press any key to continue
获取键盘的字符串:
定义一个字符数组 又足够大
#include<stdio.h>
void test11()
{
char buf[128] = "";
printf("请输入一个字符串:");
scanf("%s",buf);//不能获取带空格的字符
printf("buf=%s\n",buf);
}
int main(int argc,char *argv[])
{
test11();
return 0;
}
注意:scanf和%s使用的时候 有个缺点 遇到 空格 会结束输入
使用gets()获取
#include<stdio.h>
void test11()
{
char buf[128] = "";
printf("请输入一个字符串:");
//scanf("%s",buf); //不能获取带空格的字符
gets(buf); //获取带空格的字符串
printf("buf=%s\n",buf);
}
int main(int argc,char *argv[])
{
test11();
return 0;
}
输出结果:
请输入一个字符串:hello world
buf=hello world
gets的缺点:获取键盘输入的时候 不会管 buf的大小 容易造成内存污染
#include<stdio.h>
void test11()
{
char buf[10] = "";
printf("请输入一个字符串:");
gets(buf); //获取带空格的字符串
printf("buf=%s\n",buf);
}
int main(int argc,char *argv[])
{
test11();
return 0;
}
运行结果:
请输入一个字符串:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
buf=hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh[pre]#include<stdio.h>
char *fgets(char *s,int size, FILE *stream)
//s表示存放字符串的空间地址
//size能够提取字符串的最大长度 size-1
//stream stdin表示标准输入设备
[b]返回值:就是获取到的字符串的首元素地址
Press any key to continue[/pre]
fgets函数 即可以获取带空格的字符串 也可以保证 buf的不越界
#include<stdio.h>
char *fgets(char *s,int size, FILE *stream)
//s表示存放字符串的空间地址
//size能够提取字符串的最大长度 size-1
//stream stdin表示标准输入设备
返回值:就是获取到的字符串的首元素地址
案例 fgets :
#include<stdio.h>
void test11()
{
char buf[10] = "";
printf("请输入一个字符串:");
fgets(buf,sizeof(buf),stdin); //推荐
printf("buf=%s\n",buf);
}
int main(int argc,char *argv[])
{
test11();
return 0;
}
运行结果:
请输入一个字符串:123456789123456
buf=123456789
Press any key to continue
提高案例:
字符串的大小写 转换
#include<stdio.h>
void test12()
{
//'a' 97
//'A' 65
//说明小写字母 和 大写字母的差值 是32
char ch = 'a';
//小写 变 大写 减少32
ch = ch -32; //ch = ch -('a'-'A')
printf("%c\n",ch);
//大写 变 小写 增加32
ch = ch +32;
printf("%c\n",ch);
}
int main(int argc,char *argv[])
{
test12();
return 0;
}
运行结果:
A
a
Press any key to continue
作业:
键盘获取一个字符串 大小自定义 将字符串的大写字母变小写 小写字母变大写 其他符号保持不变
1.键盘获取一个字符串
2.用for循环 将字符串的逐个字符进行大小写转换
#include<stdio.h>
//键盘获取一个字符串 大小自定义
//将字符串的大写字母变小写 小写字母变大写 其他符号保持不变
void test13()
{
char buf[128] = "";
int i = 0;
printf("请输入一串英文:");
//获取键盘输入
fgets(buf,sizeof(buf),stdin);
for(i=0;i<128;i++)
{
//大写字母转小写
if( buf >= 65 && buf <= 96 )
{
buf = buf + 32;
}
//小写字母转大写
else if( buf >= 97 && buf <= 122 )
{
buf = buf - 32;
}
}
printf("%s\n",buf);
}
int main(int argc,char *argv[])
{
test13();
return 0;
}
二维字符数组
一维字符数组 是存放多个字符的
二维字符数组 是存放多个字符串 每个字符串占用一行
//不管是数值还是字符 的二维数组 在初始化的时候 是可以省略行标的 行数由具体初始化决定
char str[3][16] = {"hehe","haha","heihei"};
str[0] ="hehe"; str[1]="haha"; str[2]="heihei";
#include<stdio.h>
void test14()
{
char str[3][16]={"hehe","haha","heihei"};
//输出一个字符串 仅仅使用行标
printf("%s\n",str[0]);
printf("%s\n",str[1]);
printf("%s\n",str[2]);
//输出的是 字符串中的某一个字符 必须用行标和列标
printf("%c\n",str[1][3]);
}
int main(int argc,char *argv[])
{
test14();
return 0;
}
运行结果:
二维字符数组获取键盘输入的字符串:
运用场景:将键盘 需要输入 多个独立的字符串 用户必须单独存储好 请选择二维字符数组
输入的字符串个数 确定二位数组的行数
输入字符串中的最大长度 决定二维字符数组的列数
#include<stdio.h>
void test15()
{
//hehe haha xixi heihei
char buf[4][16] = {""};
int i = 0;
//获取键盘的字符串
for(i=0;i<4;i++)
{
scanf("%s",buf);//buf已经代表第i行的首元素地址
}
//输出字符串
for(i=0;i<4;i++)
{
printf("buf[%d] = %s\n",i,buf);
}
}
int main(int argc,char *argv[])
{
test15();
return 0;
}
运行结果:
heihei haha 嘿嘿 拉拉
buf[0] = heihei
buf[1] = haha
buf[2] = 嘿嘿
buf[3] = 拉拉
Press any key to continue
作业:
1.键盘输入10个int类型,对其从小-->大排序
2键盘输入字符串"acbdef"进行前后颠倒(逆置)-->"fedcba"
作业1的代码:
#include<stdio.h>
int main(int argc,char *argv[])
{
int num[10] = {0};//创建一个整型数组,初始化为0,未初始化部分自动补0
int len = sizeof(num)/sizeof(num[0]); //计算整型数组的长度
int i = 0,j=0,tmp=0;
//输入十个整数
printf("请输入%d个int类型数据:\n",len);
for(i = 0;i < len;i++)
{
scanf("%d",&num[i]);
}
//冒泡排序算法,从小到大排序数组
//外循环控制排序的轮数
for(i=0;i<len;i++)
{
//内循环控制每轮的比较次数
for(j=0;j<len-i;j++)
{
//比较相邻两个元素
if(num[j]>num[j+1])
{
//交换元素
tmp = num[j];
num[j] = num[j+1];
num[j+1] = tmp;
}
}
}
//输出排序后的数组
printf("排序后的数组为:\n");
for(i=0;i<len;i++)
{
printf("%d ",num[i]);
}
return 0;
}
|