数组和字符串

1、概述

  • 数组是在内存中连续的相同类型的变量空间
  • 数组属于构造数据类型
//数组定义
//数据类型 数组名[元素个数]={值1,值2,值3,……};
int arr[10]={9,8,7,6,5,4,3,2,1,0};//元素访问
//数组名[下标]
//数组下标从0开始
for(int i=0;i)
{printf("%d\n",arr[i]);
}//数组在内存中的存储方式和大小
for(int i=0;i<10;i++)
{printf("%p\n",&arr[i]);
}printf("%p\n",&arr);printf("数组在内存中占的大小:%d\n",sizeof(arr));
printf("数组元素在内存中占的大小:%d\n",sizeof(arr[0]));
printf("数组元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));
  • 数组在内存中是连续存储的,地址连续
  • 数组名是一个指向数组首地址的地址常量
  • 数组在内存中占的大小:数组类型*元素个数

2、数组的定义和使用

# 数组定义的方式
int arr1[10]={9,8,7,6,5,4,3,2,1,0};
int arr2[]={9,8,7,6,5,4,3,2,1,0};		//自动得到数组长度为10
int arr3[10]={1,2,3};		// 前三个分别为1 2 3 ,其余为0
int arr4[10]={0};			//所有元素都为0
int arr5[10]={1};			//第一个为1,其余为0int arr6[10];				//定义了没有赋值,内部的数据不确定,一般会乱码
arr6[0]=1;					//第一个为1,其余依然乱码int arr[];					//在这种写法不可以//这种写法不可以,数组定义的时候,数组长度必须是常量,或者常量表达式
//数组必须预先知道大小
//动态数组	开辟堆空间
int i=10;
int arr[i];//从键盘获取数组元素值
int arr7[10];
for(int i=0;i<10;i++){scanf("%d",&arr7[i]);
}
  • 数组下标越界,可能会报错,但是越界后,访问到的内容不确定。下标越界,编译器不会报错

3、数组逆置

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int i=0;
int j=sizeof(arr)/sizeof(arr[0]);
while(i<j)
{//通过临时变量交换数据int temp=arr[i];arr[i]=arr[j];arr[j]=temp;i++;j--;
}

4、冒泡排序

//内层比较次数为:元素个数-1-执行次数
//外层执行次数为:元素个数-1
int arr[]={9,1,5,7,2,10,8,4,6,3};
for(int i=0;i<10-1;i++)
{for(int j=0;i<10-1-i;j++){if(arr[j]>arr[j+1]){//通过大于或者小于号控制升序或者降序int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}
}

5、二维数组

5.1、二维数组的定义和使用
// 一维数组:数据类型 数组名[元素个数]={值1,值2,……}
// 二维数组:数据类型 数组名[行数][列数]={{值1,值2,……},{值1,值2,……},{值1,值2,……},……}
int arr[2][3]={{1,2,3},{4,5,6}};arr[1][2]=20;
for(int i=0;i<2;i++)
{for(int j=0;j<3;j++){printf("%d ",arr[i][j]);}printf("\n");
}printf("二维数组的大小:%d\n",sizeof(arr));
printf("二维数组一行的大小:%d\n",sizeof(arr[0]));
printf("二维数组的元素大小:%d\n",sizeof(arr[0][0]));printf("二维数组的行数:%d\n",sizeof(arr)/sizeof(arr[0]));
printf("二维数组的列数:%d\n",sizeof(arr[0])/sizeof(arr[0][0]));//二维数组首地址
//下面三个语句的输出结果一样
printf("%p\n",arr);
printf("%p\n",arr[0]);
printf("%p\n",&arr[0][0]);//数组的第二行的首地址
printf("%p\n",arr[1]);//二维数组初始化
int arr[2][2]={1,2,3,4,5,6};	//等价于 int arr[2][3]={{1,2,3},{4,5,6}}; 但是一般不要这么写,不方便维护//int arr[2][3]
int arr[][3]={1,2,3,4,5,6};	//int arr[3][3]
int arr[][3]={1,2,3,4,5,6,7};	//二位数组初始化的时候,列数不能省略,只能省略行
5.2、二维数组的应用
//定义一个二位数组,存储五名学生三门成绩,arr[5][3]
//求出每名学生的总成绩,平均成绩
//求出每门课的总成绩,平均成绩
int arr[5][3];//输入成绩
for(int i=0;i<5;i++)
{for(int j=0;j<3;j++){scanf("%d",&arr[i][j]);}
}
//输出成绩
for(int i=0;i<5;i++)
{for(int j=0;j<3;j++){printf("%d",&arr[i][j]);}
}//计算每名学生的总成绩和平均成绩
for(int i=0;i<5;i++)
{int sum=0;for(int j=0;j<3;j++){sum+=arr[i][j];}int average=sum/3;
}//计算每门课的总成绩和平均成绩
for(int i=0;i<3;i++)
{int sum=0;for(int j=0;j<5;j++){sum+=arr[i][j];}int average=sum/5;
}

6、多维数组

6.1、多维数组的定义
// 一维数组:数据类型 数组名[元素个数]={值1,值2,……}
// 二维数组:数据类型 数组名[行数][列数]={{值1,值2,……},{值1,值2,……},{值1,值2,……},……}
//多维数组声明:数组类型 数组名[n1][n2]……[nn];
int arr[2][3][4]={{{1,2,3,4},{2,3,4,5},{3,4,5,6}},{{4,5,6,7},{5,6,7,8},{6,7,8,9}}};
for(int i=0;i<2;i++)
{for(int j=0;j<3;j++){for(int k=0;k<4;k++){printf("%d ",arr[i][j][k]);}printf("\n");}printf("\n");
}//三维数组的大小
printf("三维数组的大小:%d\n",sizeof(arr));
printf("三维数组一层的大小:%d\n",sizeof(arr[0]));
printf("三维数组一行的大小:%d\n",sizeof(arr[0][0]));
printf("三维数组元素的大小:%d\n",sizeof(arr[0][0][0]));//三维数组的层数
printf("三维数组的层数:%d\n",sizeof(arr)/sizeof(arr[0]));
printf("三维数组的行数:%d\n",sizeof(arr[0])/sizeof(arr[0][0]));
printf("三维数组的列数:%d\n",sizeof(arr[0][0])/sizeof(arr[0][0][0]));//三维数组定义的时候,层数可以省略
//高维数组定义的候,第一个维度可以省略
int arr[][3][4]={0}//四维数组
int arr[2][3][4][5]={1,2,3};
//元素个数:2*3*4*5

7、字符数组和字符串

7.1、字符数组与字符串的区别
//定义字符数组
char arr[6]={'h','e','l','l','o','0'};	//此时不是字符串,只是字符数组
char arr2[5]={'h','e','l','l','o'};	
//字符
char ch='h';
//字符串	字符串结束标志位 \0
char *str="hello";
char arr1[]={'h','e','l','l','o','\0'};		//此时就是字符串了,数字0等同于 \0,,但是不等同于 '0'
printf("%s",arr1);
printf("%s",arr2);		//不会报错,但是输出会乱码printf("%d\n",sizeof(arr));//可以通过字符的ASCII码进行字符数组的初始化,但是下面的初始化末尾没有'\0',因此输出完前7个字符之后,后面会乱码,直到遇到内存中的'\0'为止
char ch3[]={110,111,112,101,123,98,99};
printf("%s",ch3);char ch4[]={"hello"};	//也可以,不要大括号也可以
7.2、字符数组存储字符串
//定义字符数组,存储字符串
char ch[10];//输入:helloworld ,会报错
//输入:helloworl ,会正常输入输出
//输入:hellowo ,会正常输入输出
//输入:hello wor,会输出hello
scanf("%s",ch);		//在输入字符串的时候,长度超过9个会报错printf("%s",ch);
  • 拼接两个字符串
char ch1[]="hello";
char ch2="world";
char ch3[30];//字符串拼接
int i=0;
int j=0;
while(ch1[i]!='\0')
{ch3[i]=ch1[i];i++;
}
while(ch2[j]!='\0')
{ch3[i+j]=ch2[j];j++;
}
ch3[i+j]='\0';printf("%s",ch3);
7.3、字符串输入输出
char ch[10];//可以在输入的时候对字符串长度进行限定,这里输入超过9个字符就不会报错,但是实际输入只有九个字符,输出也只有9个字符
scanf("%9s",ch);		
printf("%s",ch);

1)gets() 函数:从标准输入读入字符,并保存到指定的内存空间,直到出现换行符或读到文件结尾为止

char *gets(char *s);
  • 参数:s,字符串首地址
  • 返回值:成功,读入的字符串;失败,NULL
  • gets(str) 和 scanf(“%s”,str) 的区别:
    • gets(str) 允许输入的字符串含有空格
    • scanf(“%s”,str) 不允许含有空格
# include <stdio.h>
char ch[100];
char ch2[100];//通过键盘获得一个字符串
//gets() 接收字符串可以带空格
//scanf 可以通过正则表达式来接收空格
scanf("%[^\n]",ch);
gets(ch);
printf("%s",ch);

注:由于 scanf() 和 gets() 无法知道字符串的大小,必须遇到换行符或者读到文件结尾为止才接收输入,因此容易导致数组越界(缓冲区溢出)的情况。

2)fgets() 函数:从 stream 指定的文件内读入字符,保存到所指定的内存空间,直到出现换行字符、读到文件末尾或是读了 size-1 个字符为止,最后会自动加上 ‘\0’ 字符作为结束标志。

# include<stdio.h>
char *fgets(char *s, int size,FILE *stream);
  • 参数:
    • s,字符串;
    • size,指定最大读取字符串的长度(size-1)
    • stream:文件指针,如果读取键盘输入的字符串,固定写作 stdin
  • 返回值:
    • 成功:成功读取的字符串
    • 读到文件尾或者出错:NULL
  • fgets() 在读取一个用户通过键盘输入的字符串的时候,同事把用户输入的回车也作为字符串的一部分。通过 gets() 和 scanf() 输入一个字符串的时候,不包含结尾的 ‘\n’,但通过 fgets() 结尾多了 ‘\n’
  • fgets() 函数是安全的,不存在缓冲区溢出的问题
  • fgets() 函数可以接收空格和换行
  • fgets() 函数获取字符串长度短于元素个数会有 ‘\n’,大于则没有
char ch[10];fgets(ch,sieof(ch),stdin);
printf("%s",ch);

3)puts () 函数:从标准输出设备输出字符串,在输出完成后自动输出一个 ‘\n’

#include<srdio.h>
int puts(const char *s);
  • 参数:s,字符串首地址
  • 返回值:成功,非负数;失败,-1
char ch[]="hello world";//puts() 自带换行
puts(ch);puts("hello\0 world");		//输出结果为hello,输出的时候遇到 '\0' 停止

4)fputs() 函数:将 str 所指定的字符串写入到 stream 指定的文件中,字符串结束符 ‘\0’ 不写入文件

#include<stdio.h>
int fputs(const char *str,FILE *stream);
  • 参数:
    • str,字符串
    • stream,文件指针,如果把字符串输出到屏幕,固定写为 stdout
  • 返回值:成功,0;失败,-1
  • fputs() 是 puts() 的文件操作版本,但是 fputs() 不会自动在末尾输出一个 ‘\n’
char ch[]="hello world";
fputs(ch,stdout);
7.4、字符串的长度

1)strlen() 函数:计算指定字符串 s 的长度,不包含字符串结束符 ‘\0’

#include <string.h>
size_t strlen(const char *s);
  • 参数:s,字符串首地址
  • 返回值:字符串 s 的长度,size_t 为 unsigned int 类型
//计算字符串有效长度
char ch[100]="hello world";
printf("数组大小:%d",sizeof(ch));		//100
printf("字符串大小:%d",strlen(ch));		//11char ch1[]="hello world";
printf("数组大小:%d",sizeof(ch1));		//12
printf("字符串大小:%d",strlen(ch1));		//11
char ch1[]="hello world";
int len=0;while(ch[len]!='\0')
{len++;
}
printf("字符串的长度:%d",len);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【《设计模式之美》】如何取舍继承与组合

文章目录 什么情况下不推荐使用继承&#xff1f;组合相比继承有哪些优势&#xff1f;使用组合、继承的时机 本文主要想了解&#xff1a; 为什么组合优于继承&#xff0c;多用组合少用继承。如何使用组合来替代继承哪些情况适用继承、组合。有哪些设计模式使用到了继承、组合。 …

项目——————————

C/C Linux Socket网络编程 TCP 与 UDP_c 语言tcp socket cleint read-CSDN博客C/C Socket - TCP 与 UDP 网络编程_c socket udp-CSDN博客 登录—专业IT笔试面试备考平台_牛客网

打地鼠游戏来了

主要利用js鼠标点击事件和window.setInterval&#xff08;&#xff09;回调函数来进行实现的. 源码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1eW9qvX3zFH9qlH82-I4yOA 提取码&#xff1a;1233

信息安全概论快速复习(期末急救)

文章目录 1、DES中的S-盒输入输出问题 &#xff08;不需要记住S-盒&#xff09;2、Kerberos认证系统3、简答题&#xff08;三题每题8分&#xff09;&#xff1a;课后习题第一章、第三章、第四章第一章&#xff1a;重点关注安全模型内容&#xff0c;有几种&#xff0c;有几个分级…

在matlab中进行地理坐标和像素坐标的相互转换

clc;close all;clear; %地理坐标和像素坐标的相互转换 [pic,R]geotiffread(boston.tif); %读取带地理坐标信息的tif影像 [m,n,~]size(pic);%像素坐标转换为地理坐标 figure(1),imshow(pic),title(不带地理坐标的静态图片); hold on; scatter(n/4,m/4,500,r.); %选择1/4处像素坐…

活动回顾 (下) | 机器学习系统趋势研判,大咖金句汇总

作者&#xff1a;三羊、李宝珠、李玮栋、Yudi、xixi 编辑&#xff1a;李宝珠 在大模型时代的浪潮中&#xff0c;机器学习系统正经历着前所未有的变革。模型规模的急剧膨胀&#xff0c;让我们见证了 AI 能力的巨大提升&#xff0c;然而这种提升不仅为各个领域带来了新的机遇&…

音视频的编码格式与封装格式

音视频的编码格式与封装格式是两个不同的概念&#xff0c;视频封装格式常见的有&#xff1a;mp4&#xff0c;rmvb&#xff0c;avi&#xff0c;mkv&#xff0c;mov&#xff0c;mpg&#xff0c;vob&#xff0c;3gp&#xff0c;asf&#xff0c;rmvb&#xff0c;wmv&#xff0c;div…

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…

lv13 内核模块动态添加新功能 6

1 动态加载法 即新功能源码与内核其它源码不一起编译&#xff0c;而是独立编译成内核的插件(被称为内核模块&#xff09;文件.ko 1.1 新功能源码与Linux内核源码在同一目录结构下时 给新功能代码配置Kconfig&#xff08;模块代码与上一级相同&#xff09; 给新功能代码改写…

C++自学笔记006左值引用和右值引用

C自学笔记006左值引用和右值引用 无论左值引用还是右值引用&#xff0c;都是给对象取别名。 左值引用 左值引用就是对左值的引用&#xff0c;给左值取别名。 int& ref_data1 data1; int*& ref_ptr_data1 ptr_data1; int& ref_data2 *ptr_data2; const int&a…

基于SpringBoot的仓库管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的仓库管理系统,java项目…

八种常见顺序存储的算法

目录 1、线性枚举 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;示例说明 4&#xff09;算法描述 5&#xff09;源码详解 2、前缀和差分 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;样例分析 4&#xff09;算法描述 5&#xff09;源码…

Flink Kafka[输入/输出] Connector

本章重点介绍生产环境中最常用到的Flink kafka connector。使用Flink的同学&#xff0c;一定会很熟悉kafka&#xff0c;它是一个分布式的、分区的、多副本的、 支持高吞吐的、发布订阅消息系统。生产环境环境中也经常会跟kafka进行一些数据的交换&#xff0c;比如利用kafka con…

linux firewalld简介

firewalld简介 Firewalld上有一些预定义区域&#xff0c;可分别进行自定义&#xff0c;下表介绍了这些初始区域配置 firewalld将所有传入流量划分成区域&#xff0c;每个区域都具有自己的一套规则 任何新网络接口默认区域都将设置为public区域 区域名称默认配置trusted可信区…

类。。。。

定义一个person类&#xff0c;包含私有成员&#xff0c;int *age,string &name,一个stu类&#xff0c;包含私有成员double *sore,person p1,写出person类和stu类的特殊成员函数&#xff0c;并写一个stu的函数&#xff0c;显示所有信息。 #include <iostream>using n…

Android下载gradle失败解决方法

1、在gradle-wrapper.properties文件中查看自己需要下载gradle什么版本的包和zip路径&#xff08;wrapper/dists&#xff09;。 2、在setting中查看Gradle的保存路径&#xff0c;如下图&#xff1a;C:/Users/Administrator/.gradle&#xff0c;加上第一步的zip路径得到下载grad…

15 Sequence-Driver-Sequencer communication in UVM

我们分别讨论了sequece_item、sequence、sequencer和driver。在本节中&#xff0c;我们将讨论他们如何相互talk&#xff0c;sequencer如何给driver提供从sequence里的sequence item。在开始阅读本节之前&#xff0c;请确保您了解sequencer和driver中使用的所有方法。&#xff0…

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动&#xff08;建议&#xff09; sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…

USACO08FEB Hotel G

题目描述 分析 可以用线段树维护区间内连续的空房的最长长度&#xff0c;但转念一想&#xff0c;连续的空房可以横跨左孩子管辖的区间和右孩子管辖的区间&#xff0c;所以还得维护从区间开头开始的最长连续空房&#xff0c;和从区间结尾开始的最长连续空房&#xff0c;更新节…

设计模式之-桥梁模式,快速掌握桥梁模式,通俗易懂的讲解桥梁模式以及它的使用场景

文章目录 一、快速掌握桥梁模式二、使用场景三、代码示例五、 桥梁模式的优点包括&#xff1a;听一个故事来讲解桥梁模式&#xff0c;加深理解 一、快速掌握桥梁模式 设计模式中的桥梁模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分…