找回密码
 register

QQ登录

只需一步,快速开始

[*编程自学*] 第十五课(20.20):字符数组

[复制链接]

[*编程自学*] 第十五课(20.20):字符数组

[复制链接]
Waylee

主题

0

回帖

7459

积分

仙帝

积分
7459
Waylee 2024-8-4 15:39 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×
字符数组
本质是数组,只是数组的每个元素是字符
//定义一个数组 有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;
}

运行结果:
hehe
haha
heihei
a

二维字符数组获取键盘输入的字符串:
运用场景:将键盘 需要输入 多个独立的字符串 用户必须单独存储好 请选择二维字符数组
输入的字符串个数 确定二位数组的行数
输入字符串中的最大长度 决定二维字符数组的列数
#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;
} 





雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |网站地图|天天打卡

GMT+8, 2024-11-22 02:00 , Processed in 0.060395 second(s), 12 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表