C语言DAY10 - 字符串
来源:互联网 发布:编程语言的种类 编辑:程序博客网 时间:2024/05/30 04:58
- 一二维数组
- 语法
- 1创建
- 2存储
- 3取出
- 4声明补充
- 5声明
- 一二维数组
- 最常用
- 二二维数组在内存中的存储
- 高地址向低地址连续申请行列每个元素占用的字节
- 求二维数组的地址和长度
- 三二维数组和函数
- 解决方案
- 二二维数组在内存中的存储
- 字符数组
- 字符串
- 使用双引号引起来的数据叫做字符串
- 不管那种方式系统都是以第一种最根本的方式字符数组存储的
- 如果指定长度小于字符串的长度就会出现存储不下的情况
- 不能通过 siceof 计算有可能字符串数据存储在字符数组中只占了一部分
- 下面四个是
- cmpcompare
- 使用双引号引起来的数据叫做字符串
- 字符串
一.二维数组
语法:
1)创建
元素类型 元素名[行数][列数]
int arr [3][4]
2)存储
二维数组名[行下标][列下标] = 数据
行列下标越界会更改分配内存外的数据
3)取出
数据类型 变量名 = 二维数组名[行下标][列下标]
4)声明补充
声明必须指定行数列数
行数列数可以是变量 常亮 宏 表达式 1 0等
不能是小数 也不能是负数
如果声明没有赋值,元素中是垃圾值
5)声明
1.先声明 在一个个初始化
2.声明时初始化
这样行数可以省略
最常用
int arr [][4] = {
{10,20,30,40},
{50,60,70,80},
{90,100,110,120}
};
3.自动分行
也可以省略行数,总数除以列数自动分行
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
4.部分初始化
int arr[3][4] = {{10},{20},{30}};
初始化指定行数据,其他的数据自动初始化为0.
省略数据,自动计算行数
int arr[3][4] = {1,2,3,4,5};
给指定的行赋值
int arr[3][4] = {[1]={1,2,3,4},[2]={5,6,7,8}};
给指定的元素赋值
int arr[3][4]={[0][1]=20,[1][3]=6};
其他的值初始化为0
二.二维数组在内存中的存储
1.高地址向低地址连续申请(行列每个元素占用的字节)
二维数组的本质其是个一维数组
类型是数组的长度为行数的一维数组
2.求二维数组的地址和长度
1)
arr = arr[0] = arr[0][0]
2)真正的元素的个数
sizeof(arr)/sizeof(arr[0][0])
行数
int rows = sizeof(arr)/sizeof(arr[0]);
列数
int cols = sizeof(arr[0])/sizeof(arr[0][0])
三.二维数组和函数
- 1 二维数组作为参数传递给函数会丢失行列,因 为传递的是一个8字节的地址,数组的最低字节的地址.
- 2 作为参数的时候行数可以省略,可以和函数声明的不一样,列数不行
- 3 传递数组的时候将行数和列数一起传递
解决方案:
先声明行数和列数,最后在写二维数组.
void arr(int rows,int cols,arr[][cols]); 1. 形参二维数组行数可以省略,列数不行2. 实参二维数组行数可以任意,但列数必须保持一致.
字符数组
声明字符数组
char chs[4];
chs[0] = ‘a’;
chs[1] = ‘b’;
chs[2] = ‘a’;
chs[3] = ‘z’;char chs[4] = {‘a’};
//初始化部分元素,其他元素自动被初始化未\0
//\0的 asc 码是0- 字符数组的取值和遍历 for 循环
- char 变量不能存中文,一个中文3个字节,char 只有1个
字符串
使用双引号引起来的数据叫做字符串.
原理
- 字符串是由一个个字符组合起来的
- 所以我们用字符数组存储字符串数据
- 将字符串数据的没一个字符存储到字符中,并在后面追加一个\0代表存储完毕.
语法
一.字符数组 char name [4]; name[0] = 'j'; name[1] = 'a'; name[2] = 'c'; name[3] = 'k';二.字符串最根本的方式 char name[5] = {'j','a','c','k','\0'}; //5可以任意值,\0代表结束三.简写方式 char name[] = {"jack"}; //系统会将字符串的每一个字符存储到字符数组中,并自动追加'\0'四.最常用的方式!!! char name[] = "jack"; //系统会将字符串的每一个字符存储到字符数组中,并自动追加'\0'
不管那种方式系统都是以第一种最根本的方式字符数组存储的
计算字符串长度
char name[] = “中国”;
int len = sizeof(name);
//如果指定了长度,那就是指定的长度了
//如果声明字符数组的同时就声明一个字符串,就可以用中文.一个中文3个字符.
如果指定长度小于字符串的长度,就会出现存储不下的情况
打印 %s
printf(“%s\n”,name);
//传递字符数组地址,逐字节输出,遇到\0为止.char str1[] =”jack”;
char str2[4] = “rose”;
printf(“%s”,str2);
//打印结果 rosejackchar str1[] ={‘j’,’a’,’\0’,’k’,’\0’};
char str2[3] = {‘r’,’o’,’s’,’e’};
输出结果为:rosja
超出数组范围部分丢掉//如果这样写,那就把 str1[0]改成了’e’了.
str2[3] = ‘e’;接收 %s
char str[10];
//准备一个10个长度的字符串
scanf(“%s”,str);
//数组的名称代表数组地址,不需要取地址注意:
- 输入的字符串数据在给定的字符长度存储不下,就会崩溃.
- 输入的时候如果有空格就会认为输入结束
不安全:
- 字符存储不下会报错.
- 空格会认为结束
- scanf 就这样的没法解决
计算数组长度
不能通过 siceof 计算,有可能字符串数据存储在字符数组中只占了一部分.
char name[100] = "jack";sizeof(name);//这个字符串就是100长度.字符串只有4个int len = 0;while(name[len]!='\0')
puts( )输出
作用: 用来输出字符串
语法格式: puts(字符数组名);
优点: 输出完毕,自动换行
缺点:只能输出字符串,也不能使用占位符gets( )接收
char name[10];
printf(“请输入你的姓名:”);
gets(name);
作用:接收一个字符串
优点:可以接收空格
缺点:字符数组长度不够,都会崩溃
指针会讲一个安全的方法
下面四个是
cmp–>compare
char name1[] ="jace";char name2[] = "rose";int res = strcmp(name1,name2);//结果是name1-name2同位置字符的 acs 码的差.
strcpy( ) 拷贝
char name1[] = “smith”;
char name2[] = “:jack”;strcpy(name1,name2);
- name2–>name1 拷贝不是移动
- ‘\0’ 也一起拷贝
- 如果name1长度不够无法存储 name2运行会崩溃
strcat( ) concat:连接.
strcat(name1,name2);
作用:把存储在 name2的字符串链接到 name1后面
从name1的\0开始覆盖,两个合成一个
如果name1无法再存储name2,就会崩溃.
- C语言DAY10 - 字符串
- C语言:Day10~Day11
- C语言--指针数组--动态内存分配+结构体数组(递归指针)--day10
- day10
- day10
- day10
- day10
- day10
- day10
- DAY10
- day10
- day10
- day10
- Day10
- day10
- Day10
- day10
- day10
- apache +tomcat 集群配置
- 字符串最后一个单词的长度
- 画虚线
- URL中的保留和不安全字符
- 20160910------JAVAWEB概述
- C语言DAY10 - 字符串
- 5.17
- 关于vfp6.0无法导入excel的问题解决
- 华硕笔记本nvidia显示设置不可用?
- 如何通过 bin setTitleEdgeInsets setImageEdgeInsets改变图片和文字的位置
- BZOJ 1009: [HNOI2008]GT考试【KMP上DP+矩阵快速幂
- Android基础控件之ListView详细使用讲解
- 自定义myScrollview
- javascript实现拖拽的原理