字符数组及字符串处理函数,二维数组08

一维字符数组

1.定义和声明字符数组

数据类型 数组名[数组长度];
   int       a    [10];
   char      s    [20]; //一维字符型数组

从数组角度:

char s[20] = {'a','b','c','d'};//未初始化的部分为零
数组 用来 存储数据的 
   一维字符型数组 --- 放字符串 
   "hello" //字符串  

2. 初始化字符数组

字符数组可以在定义时进行初始化,也可以在后续赋值操作中进行初始化。

char str[] = "Hello";  // 编译器根据字符串长度自动分配空间
char vowels[] = {'a', 'e', 'i', 'o', 'u'};  

3. 访问字符数组元素

字符数组的每个元素可以通过下标来访问,下标从0开始。

char str[] = "Hello";
char ch = str[0];  // 访问数组的第一个元素,即'H'
str[1] = 'a';  // 修改数组的第二个元素为'a'

4. 字符数组和字符串

在C语言中,字符数组常用来表示字符串,以null字符('\0')结尾。

  1.字符串 是 当做字符数组来处理的。
  2.字符串 有一个专门的结束标志 '\0'
  3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据 
  4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据 
  5.字符数组可以用来存储字符串 
    而
    字符串在内存中存储的方式 也是以 字符数组形式存储的     
   
  "hello" --- 'h''e''l''l''o''\0'
               实际占用的内存空间,是包含了'\0'   

""  //字符串 --- 空字符串 '\0'

  • 字符数组: 可以静态初始化或者动态初始化,可以用字符序列、单个字符或者其他字符数组的方式进行初始化。

  • 字符串: 需要以null字符结尾。可以直接赋值给一个字符数组,也可以通过strcpy等字符串操作函数进行赋值。

  • 字符数组: 可以直接通过下标访问每一个元素,并进行修改。字符数组没有特定的终止字符要求。

  • 字符串: 通常通过字符串操作函数(如strcpy、strcmp、strlen等)来处理,以确保操作的安全性和正确性。字符串的长度可以用strlen函数获取。

  • 字符数组: 可以用于存储任意字符的数组,不一定以null字符结尾,可以存储像数字、符号等其他字符。

  • 字符串: 是一个以null字符结尾的字符数组,主要用于表示和处理文本信息。

    // 字符数组的定义和使用
    char arr1[5] = {'H', 'e', 'l', 'l', 'o'};  // 字符数组,不是字符串,没有null结尾
    char arr2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 字符数组,以null结尾,是一个字符串
    
    // 字符串的定义和使用
    char str1[] = "Hello";  // 字符串,编译器自动添加null结尾
    char str2[10];
    strcpy(str2, "Hello");  // 使用strcpy函数将字符串复制给字符数组,确保以null结尾
    

    字符串处理函数

1.puts

 int puts(const char *s);
功能:
            将一个以null结尾的字符串输出到标准输出(stdout),并自动添加一个换行符('\n')。

int i = 0;
while(s[i] != '\0')
{
    printf("%c",s[i]);
    ++i;
}
putchar('\n');

参数:
         s   //表示字符串 -- 指针类型 
             //字符数组名 s
             //字符串常量 "hello"
返回值:
          成功 非负数 
          失败 -1 
注意:
       puts输出时 自动会加 换行 

puts("Hello, world!");  // 输出字符串 "Hello, world!" 并自动换行
char s[] = "hello";
puts(s);//输出字符数组s

2.gets 

char *gets(char *s);
     功能:
         从键盘获得一个字符串 
     参数:
         s  //代表就是一块存储空间 --- 需要的是一个一维字符型数组的数组名
     返回值:
        成功 s 
        失败 NULL 

char buffer[100];
gets(buffer);  // 从标准输入读取一行输入到 buffer 中(不推荐使用,因为存在缓冲区溢出的安全风险)

3.strlen

首先我们要了解:

char s[] = "hello"; 
s的长度 ---数组的长度 6 
char s[10] = "hello";
s的长度 ---数组的长度 10 


'h''e''l''l''o''\0' 
字符串长度 
     '\0' 前面字符个数
     "hello" 字符串长度 5个 
             它所占的内存空间的字节数是 6 个

字符串函数:
  <string.h>
 size_t strlen(const char *s);
 功能:  
     计算字符串长度 

char a[20];
int i;
i = 0;
while(a[i] != '\0')
{
	i++;
}

 参数:
    s //表示需要一个指针
      可以给的参数形式
      a.数组名 
      b.字符串常量 
 返回值:
     返回字符串长度

printf("%ld\n",strlen(a));//返回字符串a的字符长度
printf("%ld\n",strlen("world hello"));//参数也可以是字符串,长度为11

4.strcpy

字符串是不能整体赋值的

char s1[10];
gets(s1);
char s2[10];
s2 = s1; //字符串不能操作  数组不能整体赋值 

char * strcpy(char *dest, const char *src);
功能:
   复制字符串
   将src中字符串,复制到dest 
参数:
  src   // 表示原字符串 
          可以给的实参形式:
          a.一维字符数组名
          b.字符串常量           
  dest  // 表示目的字符串
         可以给的实参形式:
          一维字符数组名

strcpy函数简单用代码可以表示为

char s1[20],s2[20];
gets(s1);
int i;
i = 0;
do
{
	s2[i] = s1[i];
}while(s1[i++] != '\0');

strcpy使用

strcpy(s2,s1);//将s1的值赋值给s2

5.strcat

//s1+s2  //字符串拼接 
代码:
  //1.定位到s1的'\0'
     循环判断是不是'\0'
     不是继续往后找  
     i 记录此时 下标位置 
  //2.从这个位子开始
      将s2中的元素依次复制过来

	char s1[20],s2[20];
	printf("输入第一句:");
	gets(s1);
	printf("输入第二句:");
	gets(s2);

    int i,j;
	i = 0;
	j = 0;
	while(s1[i] != '\0')
	{
		++i;
	}

	do
	{
		s1[i] = s2[j];
		++i;
	}while(s2[j++] != '\0');

   char *strcat(char *dest, const char *src);
   功能:
       拼接字符串 
   参数:
      dest  //目的字符串 
            可以使用的实参形式
            一维字符型数组名 
      src   //源字符串 
             可以使用的实参形式
            a.一维字符型数组名  
            b.字符串常量 
 eg:

 char dest[100];
 char src[100] = "world";
 strcat(dest,src);
 strcat(dest,"english");

6.strcmp

字符串 比较规则 

字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按 ASCII 码值大小比较),直到出现不同的字符或遇到'\0' 为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第1个不相同的字符的比较结果为准

比较的结束的条件:
s1[i]!=s2[i] || s1[i]=='\0' || s2[i] == '\0'

只看,结束时,s1 最后一个字符 和 s2最后一个字符 之间的大小关系

函数功能大致如下:

	char s1[20],s2[20];
	gets(s1);
	gets(s2);

	int i = 0;
	for(i = 0;i < 20;++i)
	{
		if(s1[i] != s2[i] || s1[i] == '\0' || s2[i] == '\0')
		{
			break;
		}
	}

	if(s1[i] > s2[i])
	{
		printf("s1大\n");
	}else if(s1[i] < s2[i])
	{
		printf("s2大\n");
	}else
	{
		printf("相等\n");
	}

 int strcmp(const char *s1, const char *s2);
 功能:
     比较字符串大小 
 参数:
  s1  //字符串 
  s2  //字符串 
     数组名 
     字符串常量 
     
返回值: //最后 停的位置上字符的差值 来反映大小 
  s1 > s2  // >0  1 
  s1 == s2 // 0 
  s1 < s2  // <0  -1

实例

    int n;
	n = strcmp(s1,s2);
	if(n > 0)
	{
		printf("s1大\n");
	}else if(n < 0)
	{
		printf("s2大\n");
	}else
	{
		printf("相等\n");

二维数组

1.定义和声明

type arrayName[rowSize][colSize];

其中:

  • type 是数组中元素的类型,可以是任何基本数据类型,也可以是结构体、联合体等自定义类型。
  • arrayName 是数组的名称。
  • rowSize 表示数组的行数,即二维数组中包含多少个一维数组。
  • colSize 表示每个一维数组的列数,即每个一维数组中有多少个元素。

int a[3][4];//表示定义了一个包含有三行四列总共十二个int型元素的二维数组

2.初始化二维数组

  int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//全部初始化                 
  int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化                
  int a[3][4] = {1,2,3,4,5,6};//部分初始化     
  int a[3][4] = {{1,2},{5,6},{9,10}};//全部初始化

scanf输入

	int a[3][3];

	int i,j;
	i = 0;
	j = 0;

	for(i = 0;i < 3;++i)
	{
		for(j = 0;j < 3;++j)
		{
			scanf("%d",&a[i][j]);
		}
	}

3.二维数组元素引用

可以通过数组下标访问二维数组中的元素,下标从0开始。示例:

int value = matrix[1][2];  // 获取第二行第三列的元素

输出全部二维数组的值

	for(i = 0;i < 3;++i)
	{
		for(j = 0;j < 4;++j)
		{
			printf("a[%d][%d] = %d\n",i,j,a[i][j]);
		}
	}

4.二维数组本质

 int a[4]; //一维数组 
           //数组也是一种数据类型 
           //int[4]

  类型说明符 数组名[常量表达式];
    int[4]    a    [3];   
    
    int[4] a[3]; // 一维数组 
                 // 这个一维数组的元素 又一个一维数组类型 
    

    //int[4] a[3]; //c语言不支持这样写 
    int a[3][4]; //二维数组 

注意:

1.c语言中,并不存在真正的二维数组,都是用一维数组模拟的。

2.二维数组的本质
      实际上 一维数组类型的一维数组 
     //数组的数组        

3.二维数组数据存储时,
      按行优先存储 
      
    int a[3];
    a[0];
    int a[3][4];
    a[x][y];
    int[4] a[3];
    a[0] [x]
    

4.多维数组 
    
    int a[3][4];
    int a[3][4][5]; //三维数组 --- 是二维数组类型的一维数组 
    int[4][5] a[3] //n维数组 --- n-1维数组类型的 一维数组 

eg:将

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

置换为

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16

	int i,j;
	i = 0;
	j = 0;
	int n = 0;
	for(i = 0;i < 4;++i)
	{
		for(j = 0;j < 4;++j)
		{
			a[i][j] = ++n;
		}
	}
	
	int temp;
	for(i = 0;i < 4;++i)
	{
		for(j = i;j < 4;++j)
		{
			temp = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = temp;
		}
	}

	for(i = 0;i < 4;++i)
	{
		for(j = 0;j < 4;++j)
		{
			printf("%d ",a[i][j]);
		}
		putchar('\n');
	}

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值