(八)数组和字符串

本篇介绍C语言数组、字符串、字符串处理函数、字符处理函数。

数组

数组中的所有元素都具有相同类型,数组是一种构造数据类型。

  • 一维数组
    一维数组,是“一维”的,只有一个下标。一维数组在计算机的存储结构是连续编址的。如int a[2];,表示整型数组a有2个元素,存储结构为:依次存放a[0]、a[1]。以冒泡排序法为例,其中包括了一维数组的定义、初始化、引用。
# include <stdio.h>
int main()
{
    int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};//数组的定义及初始化 
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf;  //交换数据时用于存放中间数据
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,
        {
            if (a[j] < a[j+1])
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}

运行结果:
在这里插入图片描述

  • 二维数组
    二维数组,顾名思义是“二维”的,有两个下标。C语言中,二维数组在计算机的存储结构是按行排列连续编址的,如int a[2][3];,表示a为一个二行三列的数组,存储结构为:依次存放a[0]、a[1]行,并且每行三个元素依次存放。
    二维数组的定义、引用、初始化如下:
//定义
int a[3][4];

//引用
b=a[2][3];

//初始化:可以按行分段赋值,也可以按行连续赋值
int a[2][2]={{1,2},{3,4}};//分段赋值
int b[2][2]={1,2,3,4};//连续赋值
int c[3][3]={{1},{2},{3}};//对每行第一列元素赋值,其它元素取0
int d[][2]={1,2,3,4};//对全部元素赋值,可以不给出第一维的长度

下面的例子为利用二维数组输出杨辉三角。

#include <stdio.h>
#define N 11
int main()
{
	int i,j,a[N][N];
	for(i=1;i<N;i++)//每行第一个元素和最后一个元素为1
	{
		a[i][i]=1;
		a[i][1]=1;
	}
	for(i=3;i<N;i++)
	{
		for(j=2;j<i;j++)
		{
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		}
	}
	for(i=1;i<N;i++)//输出杨辉三角 
	{
		for(j=1;j<=i;j++)
		{
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
   return 0;
}

运行结果:
在这里插入图片描述

  • 多维数组
    多维数组,指二维以上的数组,这里介绍三维数组的定义、初始化。对于一个多维数组的声明而言,只有第一个维度可以不指定长度,所有其他维度都必须指定长度。
//定义及初始化:下列语句都是等效的
int a[2][2][3] ={ { { 1, 0, 0 }, { 4, 0, 0 } },
                  { { 7, 8, 0 }, { 0, 0, 0 } } };//标准形式
int a[ ][2][3] = { { { 1 }, { 4 } }, { { 7, 8 } } };//因为所有只要没与初始化器的元素,就会被初始化为默认的0;第一维度可以省略
int a[2][2][3] = { { 1, 0, 0, 4 }, { 7, 8 } };
int a[2][2][3] = { 1, 0, 0, 4, 0, 0, 7, 8 };//如果某对大括号包含了比对应数组维度中元素数量还多的初始化器,那么多出来的初始化器会被关联到存储序列中的下一个数组元素中。
int a[2][2][3] = { 1, [0][1][0]=4, [1][0][0]=7, 8 };//可以利用元素指示符达到相同的初始化目的
int a[2][2][3] = { {1}, [0][1]={4}, [1][0]={7, 8} };//如果只有一小部分的元素需要被初始化为 0 以外的值,那么使用元素指示符是一个不错的做法。

字符数组与字符串

  • 区分几个概念
  1. 字符数组是存放字符型数据的,数组中每个元素的值都是单个字符,数组是C语言的一种构造数据类型。字符数组可以用来存放字符串,可用一维或二维数组。
  2. 字符串由若干个字符组成,其最后一个字符是结束标记\0,以此判断该字符串是否结束。
  3. 字符型变量只存放单个字符,不能存放字符串。
  4. C语言没有专门的字符串变量,通常用字符数组来存放字符串.
  5. 字符数组的元素相当于字符型变量。
  • 定义及初始化
    字符数组定义方法:
    存储类型char数组名[长度1][长度2]···[长度k]
    其中存储类型包括自动型,静态型(static),自动型即默认情况不加任何修饰符;静态型要加修饰符static,详情见C语言static的作用
    赋值方法:
    • 按单个字符的方式赋值,其中必须有一个字符是结束标记\0
    • 直接写字符串赋值
      不赋初值的元素值为空字符,空字符的值是0,等于字符串结束标记\0
      举例:
//按单个字符方式赋值
char a[3]={'1','2'};//a[3]='\0'
char b[]={'1','2'};//所有元素赋值可省略数组长度
char c[]={'A',' ','C','D'};

//直接写字符串赋值
char d[]={"A BCD"};
char e[]="A BCD";
char f[3]="12";//f[2]='\0'
char g[4]="12";//g[3],g[4]='\0'
  • 字符数组的输入和输出
    格式化输入输出,包括%c%s
    使用%s格式,从键盘上向字符数组输入字符串时,回车换行或空格符均作为字符串的结束标记。
    举例:
//使用"%c"逐个输入输出
char a[8];
scanf("%c%c",&a[0],&a[1]);
printf("%c%c",a[0],a[1]);

//使用"%s"逐串输入输出
char b[10];
scanf("%s",b);
printf("%s",b);

字符串处理函数

C语言字符串处理函数包含在头文件“string.h”当中,常见字符串处理函数如下图:
在这里插入图片描述举例:


#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
 
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
 
   return 0;
}

运行结果:
在这里插入图片描述注:更多字符串处理函数用法见文章👇
字符串处理函数
C语言中常见的字符串处理函数
C 标准库 - <string.h>👈其中包括了<string.h>头文件包括函数的所有详细用法

字符处理函数

C语言字符处理函数包含在头文件“ctype.h”当中,常见字符处理函数如下:
在这里插入图片描述此外,标准库包含两个转换函数:
在这里插入图片描述
注:更多字符串处理函数用法见文章👇
C 标准库 - <ctype.h>👈其中包括了<ctype.h>头文件包括函数的所有详细用法

  
  


总结一下,数组是同类型数据的集合,是一种构造数据类型,让编程的更加方便;对于字符数组,C语言中由于没有专门的字符串变量,故通常用字符数组来存放字符串。数组的定义及初始化很基础,但也非常重要,同时我们也可以多了解头文件<string.h>、<ctype.h>对应字符串处理函数、字符处理函数的用法。

小僧初来乍到,希望大家多多支持!如有纰漏,欢迎大家在评论区留言,小僧会及时更正,同时,大家如果有疑惑的地方可以把问题写在评论区,小僧看到会回复哟😄!
另外,小僧的公众号上线啦,里面有“实用工具”、“学习资源”以及许多资料,欢迎大家关注一波小僧的公众号👇

在这里插入图片描述
  
  
  
参考:
百度百科
菜鸟教程
博客园
《C语言开发从入门到精通》------王长青、韩海玲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字符数组字符串C语言中有一些本质上的区别。 1. 字符串是双引号括起来的单个或多个字符的集合,编译器会自动在结尾添加一个'\0'字符作为字符串的结束标志。字符串常量存储在只读数据段,无法通过指针修改字符串中的某个字符。 2. 字符数组是一组字符的有序集合,可以用来存储字符串字符数组必须以'\0'结尾才能被称为字符串,这个字符数组通常会分配在栈区,也可以被称为字符串。与字符串不同,字符数组中的字符是可以修改的。如果字符数组中没有'\0'结尾,那么它就只是一个普通的字符数组,不是字符串。 3. 字符串常量本质上是一个数组,可以被视为常量指针,代表该字符串的地址。字符串常量的字符不可改变,存储在只读数据段。字符串常量至少包含一个字符,即'\0'结束符。 总结来说,字符串是一种特殊的字符数组,具有特定的结尾标志'\0',并且存储在只读数据段。而字符数组可以用来存储字符串,但不一定具有'\0'结尾,且字符可以被修改。 #### 引用[.reference_title] - *1* *3* [(六)字符数组字符串的区别](https://blog.csdn.net/qq_36181546/article/details/113835504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言字符串字符数组的区别](https://blog.csdn.net/weixin_44343008/article/details/107419392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值