推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

C语言知识总结六:数组与字符/字符串

   2023-08-01 网络整理佚名2170
核心提示:1、C语言中没有字符串类型,字符串是存放在字符型数组中。4、C语言的字符串不能运用运算符对其操作,通过数组的方式可以遍历字符串,唯一特殊的地方就是字符串字面量可以用来初始化字符数组,字符串以数组的形式出现,以数组或指针的形式访问(更多的时候是用指针的形式)注意:只有它所指的字符数组末尾有0,才能说它所指向的是字符串:如果要构造一个字符串—>用数组,如果要处理一个字符串—>用指针

由于公众号推送规则发生变更,请点击“观看”并加“星”以第一时间获得精彩技术分享

来源于网络,入侵与删除1.数组简介

常量变量是用于存储值的命名区域。 同样,数组是一个命名区域,用于存储一系列变量值,因此可以使用数组来组织常量变量。 即数组是有序数据的集合,数组中存储的值称为数组元素。 每个数组元素都有一个关联的索引(也称为键),可用于访问该元素。 在大多数编程语言中,数组都有数字索引,这些索引通常从 0 或 1 开始。数组中的每个元素具有相同的数据类型。

一维数组是以简单排序结构排列的单结构数字数组。 一维数组是计算机程序中最基本的数组。 二维和多维数组可以看成是一维数组的多重叠加。

2、一维数组

当数组中的每个元素只有一个下标时,这样的数组称为一维数组。 程序可以通过给出数组名和该元素在数组中的位置号(即下标)来引用数组中的任何元素。 一维数组的引用定义格式为:类型+数组名[下标] 如:int a[10]

其中,a为一维数组的数组名。 该数组有10个元素,表示为a[0] a[1] a[2] a[3] a[4] a[5] a[6] a [7] a[8] a[9] 。 需要注意的是,数组是从零开始的,所以a[10]不属于这个数组的空间范围。 当在描述部分定义一个数组变量时,编译器会在内存空间中开辟一系列连续的存储单元。 对于数组来说,程序的执行部分使用数组变量而不是数组类型。 引用时,下标必须是整数,但可以是整型变量或整型表达式。 如果使用表达式,则首先计算表达式以确定下标。 程序只能将数组中的元素一一应用,而不能一次性引用整个数组。 定义数组时,需要指定数组中元素的数量。 方括号中的常数值表示数组的长度。 在数组定义前添加const关键字可以使整个数组只读,并且不能再向数组写入数据。

如:int a; 浮动a[10]; (非法)int n=5; 整数a[n]; (非法)int a[5+6]; (合法的)

初始化:(注意,使用数组之前,必须先初始化)

1.数组的初始化可以在定义的时候完成

2、只能给部分元素赋初始值,其他元素赋0。

3.如果给所有元素赋值,则在数组中声明,不需要给出数组元素的个数

4、数组的初始化可以通过使用循环给输入值赋值,也可以在程序中指定赋值

例子:

portant;overflow-wrap: break-word !important;">#include//寻找数字并查看在哪个位置portant;overflow-wrap: break-word !important;">int search(int n, int a[], int max);portant;overflow-wrap: break-word !important;">int main(void)portant;overflow-wrap: break-word !important;">{    int a[] = {1,6,5,7,4,3,2,8,11,9,10};//初始化一      portant;overflow-wrap: break-word !important;">    int n;    scanf("%d", &n);       portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">//整个数组占用的字节数可用sizeof(a)表示出来 portant;overflow-wrap: break-word !important;">int h = search(n, a, sizeof(a) / sizeof(a[0]));//用整个数组占用的字节数除以首元素的字节数可知道数组的大小 portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">if (h != -1) { portant;overflow-wrap: break-word !important;">printf("%d在第%d位上", n, h+1); portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> }else { printf("没有这个数字"); portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">return 0;portant;overflow-wrap: break-word !important;">}portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">int search(int n, int a[], int max) { portant;overflow-wrap: break-word !important;">int t = -1; portant;overflow-wrap: break-word !important;">int i; portant;overflow-wrap: break-word !important;">for (i = 0; i < max; i++) {//遍历数组 portant;overflow-wrap: break-word !important;">if (n == a[i]) portant;overflow-wrap: break-word !important;"> { t = i; portant;overflow-wrap: break-word !important;">break; } portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">return t;portant;overflow-wrap: break-word !important;">}

3. 二维数组

二维数组本质上是一个以数组为数组元素的数组,即“数组的数组”,类型说明符数组名[常量表达式][常量表达式]。

二维数组也称为矩阵,行数和列数相同的矩阵称为方阵。

对称矩阵a[i][j]=a[j][i]二维数组A[m][n],是m行n列的二维数组。 设a[p][q]为A的第一个元素,即二维数组的行下标为p到m+p,列下标为q到n+q。 当按“行优先顺序”存储时,则元素a[i][j]的地址计算为:(t为字节数)LOC(a[i][j]) = LOC(a[p] [q]) + ((i−p) * n + (j −q)) * t 当以“列优先顺序”存储时,地址计算如下: LOC(a[i][j]) = LOC (a[p][q]) + ((j −q ) * m + (i−p)) * t 存储数组所需的最小单元数为 (m-p+1) * (n-q +1) * t 字节。 二维数组只是形式上的二维,但其在计算机内部的存储方式仍然是连续的、线性的。 它只是一种特殊的一维数组。

二维数组的定义与一维数组的概念规则基本相似。 一般形式为:类型说明符+数组名[常量表达式][常量表达式]。

初始化略有不同

注意,必须给出二维数组的列数,行数可以由编译器计算。

每行一个 {},以逗号分隔

最后的逗号可以存在(一个古老的传统)

如果省略,则补零

例:阳惠三角

portant;overflow-wrap: break-word !important;">#include//杨辉三角portant;overflow-wrap: break-word !important;">int main(void) { portant;overflow-wrap: break-word !important;">int n;   portant;overflow-wrap: break-word !important;">scanf("%d", &n);   portant;overflow-wrap: break-word !important;">int i, j;  portant;overflow-wrap: break-word !important;">int a[100][100] = { 0 };//先把所有元素初始化为零  portant;overflow-wrap: break-word !important;">//由与二维数组有两个下标,所以它的遍历需要双重循环来实现     portant;overflow-wrap: break-word !important;">for (i = 0; i < n; i++) {    portant;overflow-wrap: break-word !important;">    a[i][0] = a[i][i] = 1;//将第一位数字和最后一位数组初始化为1   portant;overflow-wrap: break-word !important;"> }   portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">int t; portant;overflow-wrap: break-word !important;">for (i = 1; i <=n; i++) {//遍历赋值 portant;overflow-wrap: break-word !important;">for (j = 1; j <=i-1; j++) { portant;overflow-wrap: break-word !important;"> a[i][j] = a[i - 1][j-1] + a[i - 1][j];//每一位上的数字相当于两肩上的和 portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">for (i = 0; i < n; i++) {//遍历输出 portant;overflow-wrap: break-word !important;">for (t = i; t < n; t++) { portant;overflow-wrap: break-word !important;">printf(" "); portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">for (j = 0; j <=i; j++) { portant;overflow-wrap: break-word !important;">printf("%6d", a[i][j]); portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">printf("\n"); portant;overflow-wrap: break-word !important;"> } portant;overflow-wrap: break-word !important;">return 0;portant;overflow-wrap: break-word !important;">}

尖端

1、编译器和运行环境都不会检查数组的下标是否越界。 无论是对数组单元进行读还是写,一旦程序运行,越界的数组访问都可能会出现问题,导致程序崩溃。

2.但有时也有可能运气好,不会造成严重后果。

3. 因此,程序员有责任让程序仅使用有效的下标值:[0 - 数组的大小减 1]

4.数组可以出现在赋值号的左边或者右边,左边的称为左值,右边的称为右值

5、如果定义数值数组时指定了数组的长度并初始化,系统有时会自动将没有“初始化”的元素初始化为零; 如果是字符类型,会初始化为'\0',如果是指针类型,会初始化为NULL,即空指针,不过最好自己初始化。

4. 字符输入输出

输入有五种类型:gets()、()、getch() scanf() fgets()(文件类)

有五个输出:puts()、()、putch()、() fputs()(文件类

进入:

1、gets()函数原型:char * gets(char * ptr); 用于从标准输入流stdin中读取整行(以'\n'或EOF结尾),回车键会被过滤掉,不会被读入字符串,写入到指向的字符数组中,并且返回指针; 出错或文件结束时返回 NULL。 行末尾的 '\n' 是从流中获取的,但不写入数组。 gets()不会检查正在写入的数组大小。可以无限读取,无需判断上限,读取以回车结束

2、()函数原型:int(void); 一次只读取一个字符,用于从标准输入流stdin读取字符,包括回车键也会被读取为一个字符,并返回这个字符。 如果读取到文件结尾,则返回 EOF。 注意EOF不能用char类型表示,所以()函数返回一个int类型的数字。它输入的字符存储在sewll的缓冲区中,直到用户按回车后才会执行,但如果输入超过一个字符,后面的()再次执行时会直接从缓冲区读取

portant;overflow-wrap: break-word !important;">#includeiportant;overflow-wrap: break-word !important;">nt main(void) {  portant;overflow-wrap: break-word !important;">char n[5] = {0};int a = getchar(n);//第一次多次输入字符 portant;overflow-wrap: break-word !important;"> (使用getchar时需要定义一个变量暂时存放数据)portant;overflow-wrap: break-word !important;">int c = getchar(n);//后面这些就是直接从a输入的哪些被放到缓冲区的读取了portant;overflow-wrap: break-word !important;">int b = getchar(n);portant;overflow-wrap: break-word !important;">printf("%c", a);portant;overflow-wrap: break-word !important;">printf("%c", b);portant;overflow-wrap: break-word !important;">printf("%c", c);            portant;overflow-wrap: break-word !important;">//输入abc          portant;overflow-wrap: break-word !important;">char p;     portant;overflow-wrap: break-word !important;">// p=getch();//用它不用按回车键  portant;overflow-wrap: break-word !important;">        p=getchar();   portant;overflow-wrap: break-word !important;">int b = getchar();       portant;overflow-wrap: break-word !important;">int c = getchar();     portant;overflow-wrap: break-word !important;">putchar(p);//输出abc    portant;overflow-wrap: break-word !important;">putchar(b);     portant;overflow-wrap: break-word !important;">putchar(c);}

3、getch()函数原型:int getch(void); 它的功能与getch基本相同,不同的是getch直接从键盘获取值,不等待用户按键,直接返回用户输入的ASCII码值,并返回-1 (getch和getch都可以在程序末尾作为“暂停键”使用,此时括号不需要参数,按任意键继续)

4. Scanf()在输入单个字符时使用%c数据类型说明符,在用于字符串时使用%s数据类型说明符(注意使用%s时不需要添加&)

输出:

1、puts()函数原型:int put(const char *s); 返回值:用于将字符串输出到标准输出设备(屏幕)并换行,将字符串输出到标准输出设备,并转换'\0' 对于回车换行,只能输出字符串,而数值​​无法输出或更改格式。 您可以将字符串直接写入puts()函数中:puts("Hello, world!"); (puts()和gets()都是数组函数,数组必须在输入或输出之前定义,简单输入后就会输出)(puts(st);st是数组名)

2、()函数原型:int(int char); 返回值:该函数以 char强制转换为int的形式返回写入的字符。 当输出正确时,返回int( char)转换为输出字符)值,当输出错误时,返回EOF(End of file)文件结束,表达式可以是字符或整数,只能是一次输出一个字符,如:“('#')”输出字符“#”(函数原型在stdio.h中)

3. putch()函数原型:int putch(int ch); 返回值:如果输出成功,函数返回字符; 否则,返回 EOF。 将字符ch输出到当前光标位置的文本屏幕,然后光标自动向右移动一个字符位置(函数原型在头文件conio.h中)

用法: 1. putch('转义字符'); 2. putch('单个字符'); 3. putch(字符变量);

注意:必须先定义char字符变量='单个字符';

4. 当()作为单个字符输出时,使用%c数据类型说明符,当作为字符串输出时,使用%s数据类型说明符

(puts()的输入和输出有一定的区别,puts()遇到'\0'时会终止,但使用时不会出现这种情况。)

(函数可以输出各种类型的数据,函数只能输出字符数据,puts函数可以输出字符串数据。)

5. 单字符数组

字符数组是用于存储字符数据的数组。 其定义的一般形式为:char数组名[数据长度]。 字符数组用于存储字符或字符串,字符数组中的一个元素存储一个字符,在内存中占用一个字节。 用于存储字符数据的数组称为字符数组。 字符数组中的一个元素存储一个字符。 定义字符数组的方法与定义数值数组的方法类似。 由于字符数据以整数形式(ASCII码)存储,因此也可以使用整数数组来存储字符数据。 但此时每个数组元素占用2个字节的内存单元,浪费存储空间,而且还可以是多维数组。

初始化:

1、字符数组的初始化和数值数组的初始化没有本质区别。 但除了将字符一一分配给数组元素外,还可以直接用字符串初始化。

2、用字符常量一一初始化数组:char a[5]={'a','b',,'c','d','e',}; 依次将8个字符赋值给c[0]~c[4]这5个元素

3、如果定义字符数组时没有初始化字符数组,则数组中每个元素的值是不可预测的。 如果字符数大于数组长度,则会出现语法错误。 如果初始值的个数小于数组的长度,这些字符只会被分配给数组中最前面的元素,其余元素将自动设置为空字符(即'\0')。如果提供的初始值的个数与预定的数组长度相同,定义时可以省略数组的长度,系统会自动根据初始值的个数确定数组的长度

示例:输入一行字符,统计其中有多少个单词以及有多少个(大写和小写),单词之间用空格分隔

portant;overflow-wrap: break-word !important;">#includeportant;overflow-wrap: break-word !important;">int main(void)portant;overflow-wrap: break-word !important;">{  portant;overflow-wrap: break-word !important;">char a[100] = {0};  portant;overflow-wrap: break-word !important;">int sum = 0;  portant;overflow-wrap: break-word !important;">  gets(a);//字符的输入函数      portant;overflow-wrap: break-word !important;">int i=0;    portant;overflow-wrap: break-word !important;">int t = 0;  portant;overflow-wrap: break-word !important;">while(1){      portant;overflow-wrap: break-word !important;">if (a[i] == '\0') {     portant;overflow-wrap: break-word !important;">break;       portant;overflow-wrap: break-word !important;">     }else if (a[i] == ' ') {       portant;overflow-wrap: break-word !important;">         sum++;         portant;overflow-wrap: break-word !important;">   }        portant;overflow-wrap: break-word !important;">if (a[i] == 'a' || a[i] == 'A') {     portant;overflow-wrap: break-word !important;">           t++;          portant;overflow-wrap: break-word !important;">  }         portant;overflow-wrap: break-word !important;">       i++;       portant;overflow-wrap: break-word !important;"> }      portant;overflow-wrap: break-word !important;">printf("有%d个单词,%d个a", sum+1, t);     portant;overflow-wrap: break-word !important;">return 0;portant;overflow-wrap: break-word !important;">}

6. 字符串(数组)

1、C语言中没有字符串类型,字符串是以字符数组的形式存储的。 字符在现实中体现为人们所使用的字符如文字、符号、数字等,而体现在编程中,字符是字符类型的变量。 C语言使用ASCII编码对字符进行编程,编码后可以用一个char变量来表示一个字符。 C语言中的字符串是由多个字符封装在一起组成的。 在内存中,字符串实际上是由连续分布的多个字节组成的。

2、字符串通常以整个字符串为操作对象,以整数0('\0'同理)或NULL结尾。 '\0'标记字符串的结束,也是字符串的符号,但在计算长度时不使用。 包括这个0,这里补充一下:字符串的存储类似于字符数组,所以可以提取出它的每一个单独的元素,比如s="",那么s[1]="b",s[ 9]="j",而字符串的零位就是它的长度,比如s[0]=10,这样可以给我们提供很多方便,比如每一位都可以转换成数字,存储在高精度计算时的数组

3. 字符串或字符串()是由数字、字母和下划线组成的字符串。 一般记为s=“a1a2…an”(n>=0)。 字符()是连续的符号或值序列,例如符号串(一串字符)或二进制数字串(一串二进制数字)。 字符串最基本的两种存储方式是顺序存储和链接存储。

4、C语言中的字符串不能用运算符进行操作。 字符串可以通过数组进行遍历。 唯一的特殊功能是字符串文字可用于初始化字符数组。 字符串以数组的形式出现。 或者以指针的形式访问(更常见的是指针的形式)

C语言标准库和.h头文件中提供了一系列字符串操作函数

5、字符串常量:char *s=“Hello world”; s是一个指针,初始化为指向一个字符串常量,因为这个常量的位置,s实际上是一个const char *s,但是由于历史原因,编译器接受不带const的char *s的写法,但是如果你尝试写入s指向的字符串,可能会造成严重的后果,所以如果需要修改字符串,应该使用数组,char s[ ] = "Hello world";

“Hello”将被编译器转换为字符数组并放置在某处。 这个数组的长度是6,最后会有一个0来表示结束。 两个相邻的字符串常量将自动链接。

初始化

1、直接用字符数组初始化: char str[10]={ 'I',' ','a','m',' ','h','a','p','p' ,' y'}; (字符数组的赋值只能一一赋值)

2、利用输入字符的输入功能进行输入赋值

3. 也可以省略大括号: char str[ ]="I am happy";

尖端

字符串可以用char*的形式表示,但是char*不一定是字符串,它的意思是指向字符的指针,它可能指向一个字符数组(就像int*一样)注意:只是结尾它所指向的字符数组的值为0,可以说它所指向的是一个字符串

char *a = "Hello" 和 char b[ ] = "Hello" 的区别在于,当用作数组时,它是常量(这里是这个字符串)。作为指针时,它是一个变量(字符串不知道它在哪里)(指针可以用来处理参数和动态分配空间)所以:如果要构造字符串->使用数组,如果要处理字符串->使用指针

portant;overflow-wrap: break-word !important;"> c语言中字符串是通过字符指针来间接实现的portant;overflow-wrap: break-word !important;"> char *p="linux";    //字符串portant;overflow-wrap: break-word !important;">   char a[]="linux;    //字符数组portant;overflow-wrap: break-word !important;">   printf("p=%s.\n",p);  portant;overflow-wrap: break-word !important;">   printf("a=%s.\n",a);

字符(字符串)处理头文件

1.# //字符串处理

2.# //字符处理

其分别包含以下功能:

求字符串的长度

比较 2 个字符串,看看它们是否相同

字符串连接

字符串复制操作(要求两个字符串的长度足够)

字符串连接操作(前n个字符)

字符串复制操作(前n个字符)

查找一个字符并查询该字符在字符串中第一次出现的位置

查询s1是否是s2的子串

3、其中包含以下功能:

(使用函数时使用返回值进行操作)

对于字符串操作,有两个函数(将格式化数据写入字符串)和(读取格式化字符串中的数据)

portant;">

portant;overflow-wrap: break-word !important;">如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,portant;overflow-wrap: break-word !important;">那么我推荐你学portant;overflow-wrap: break-word !important;">Pythonportant;overflow-wrap: break-word !important;">,现有价值portant;overflow-wrap: break-word !important;">499portant;overflow-wrap: break-word !important;">元Python零基础课程portant;overflow-wrap: break-word !important;">限时免费领取,portant;overflow-wrap: break-word !important;">限portant;overflow-wrap: break-word !important;">10portant;overflow-wrap: break-word !important;">名额!


portant;overflow-wrap: break-word !important;">portant;overflow-wrap: break-word !important;">扫描二维码-免费领取


 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON