C语言学习日记——字符数组与二维数组

文章目录


前言

今天,我开始学习C语言中的字符数组和二维数组。字符数组是用于存储字符串的基本数据结构,它可以用来存储和处理字符串数据。而二维数组则可以看作是一个表格,由行和列组成,适合用来处理矩阵、图像等数据。因此,我计划通过一系列的学习和实践,来深入理解字符数组和二维数组的定义、初始化、输入输出操作以及常用的字符串处理函数。


一、字符数组

1.1.字符数组的定义

char c[10];
类型说明符 数组名[常量表达式]:

 由于字符型与整型是互相通用的,因此也可以定义一个整型数组,用它存放字符数
据,例如:

int c[10];
c[0]='a';/*合法,但浪费存储空间*/

 int型每个占4字节,char型每个占1个字节。因此,存放相同数量的元素时int型会浪费存储空间

1.2字符数组的初始化

字符数组的初始化有下面几种方式:

1.2.1逐个字符赋给数组中各元素
char c[10]={'I','a','m','h','a','p','p','y'};
 1.2.2省略数组长度
char c[]={'I','a','m','h','a','p','p','y'};

 定义时忽略数组长度,系统会自动根据初值个数确定数组长度。

1.2.3最常用的初始化方式
char c[] = "I am happy";

1.3字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的。C语言规定了一个“字符串结束标志”,以字符'\0'作为标志。系统对字符串常量也自动加一个'\0'作为结束符


说明:\0'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

1.4字符数组的输入输出 

1.4.1 gets函数

gets(s);

使用gets函数时要注意越界风险,gets函数不会计入换行符 

1.4.2 fgets函数

fgets(s ,sizeof(s),stdio);

 stdio为标准输入设备(键盘)。

1.4.3 scanf函数

scanf("%s", s); 

1.4.4 puts函数

puts(s);

puts函数自带换行符。 

1.4.5 printf函数

printf("%s\n", s); 

1.4.6 putchar函数

for (i = 0; s[i] != '\0'; i++) {
        putchar(s[i]); 
    }

 1.5字符串处理函数

在C函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C语言编译系统都提供这些函数。下面介绍几种常用的函数。

 1.5.1strlen函数(数组长度)
  1 #include<stdio.h>
  2 
  3 int main(void)
  4 {
  5     char s[10] = "hello";
  6     int i = 0;
  7     int count = 0;
  8     while(s[i] != '\0')
  9     {
 10         ++count;                                                                                                                                                                 
 11         ++i;
 12     }   
 13     printf("%d\n", count);
 14     return 0;
 15 }   

 等价于

strlen(s);

strlen函数只计算有效字符,sizeof函数吧‘\0’计算在内。

1.5.2strcpy函数(复制)
  1 #include<stdio.h>
  2 
  3 int main(void)
  4 {
  5     char s1[100];
  6     char s2[100];                                                                                                                                                                
  7     int i = 0;
  8     gets(s1);
  9     while(s1[i] != '\0')
 10     {
 11         s2[i] = s1[i];
 12         ++i;
 13     }
 14     s2[i] = '\0';
 15     puts(s2);
 16     return 0;
 17 }
                                                                                                                                                                             

 等价于

strcpy(目标数组,源数组);
1.5.3strcat函数(拼接)
  1 #include<stdio.h>
  2 #include<string.h>
  3 int main(void)
  4 {
  5     char s1[100] = "Hello,";
  6     char s2[100] = "World!";                                                                                                                                                     
  7     int j = 0;
  8     int i = 0;
  9     int len = strlen(s1);
 10     while(s1[i] != '\0')
 11     {
 12         ++i;
 13     }
 14     while(s2[j] != '\0')
 15     {
 16         s1[i] = s2[j];
 17         ++j;
 18         ++i;
 19     }
 20     s1[i] = '\0';
 21     puts(s1);
 22     return 0;
 23 }

 等价于

strcat(目标数组,源数组);
 1.5.4strcmp函数(比较)
#include <stdio.h>

int main() {
    char str1[] = "hello";
    char str2[] = "world";
    int i = 0;
    while (str1[i] != 0 && (str1[i] == str2[i]) && str2[i] != 0)
    {
        i++;
    }
    int result = str1[i] - str2[i];
    printf(" %d", result);
    return 0;
}

 等价于

strcmp(s1,s2);

 其本质是对字符的ACSII码做比较,返回值为两个字符数组的首对不同字符的ACSII码差值

 1.6字符数组应用举例

 下面是一个逆序输出字符数组的代码示例:

  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 int main(void)
  5 {
  6     char s1[100] = "Hello";
  7     int len = strlen(s1);
  8     int i = 0;
  9     for (i = 0;i < len / 2;++i)
 10     {                                                                                                                                                                            
 11         char temp = s1[i];
 12         s1[i] = s1[len - 1 - i] ;
 13         s1[len - 1 - i] = temp;
 14     }
 15     puts(s1);
 16     return 0;
 17 }

二、二维数组

2.1二维数组的定义

二维数组定义的一般形式为

类型说明符 数组名[常量表达式][常量表达式];
f1oat a[3][4],b[5][10];

 2.2二维数组的引用

二维数组元素的表示形式为
数组名 [下标][下标]

2.3二维数组的初始化

可以用下面的方法对二维数组初始化。
(1)分行给二维数组赋初值。例如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号
内的数据赋给第2行的元素…即按行赋初值。
(2)可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。例如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

对于初值小于有效值的情况,自动补0。
(3)可以对部分元素赋初值。例如:

int a[3][4]={1},{5},{9}};

它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。

 二维数组只能省略行数不能省略列数

2.4二维数组程序举例

下面是计算一个二维数组的边缘元素的平均值示例代码:

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5     int a[3][5] = {{1,2,3,4,5},{1,2,3,6,7,},{1,2,3,8,9}};
  6     double sum = 0;
  7     int rows = sizeof(a) / sizeof(a[0]);
  8     int cols = sizeof(a[0]) / sizeof(a[0][0]);
  9     int i,j;
 10     for(i = 0;i < rows;++i)
 11     {
 12         for(j = 0;j < cols;++j)
 13         {
 14             if(0 == j || 0 == i || j == cols - 1 || i == rows - 1)
 15             {
 16                 sum += a[i][j];
 17             }
 18         }
 19     }
 20      sum = sum / (double)(rows * cols);
 21     printf("%f\n",sum);                                                                                                                                                          
 22     return 0;
 23 }
                                                                                                                                                                                   
                         

 三、二维字符数组

  1. 二维数组的镜像输出
      1 #include<stdio.h>
      2 
      3 int main(void)
      4 {
      5     int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
      6     int rows = sizeof(a) / sizeof(a[0]);
      7     int cols = sizeof(a[0]) / sizeof(a[0][0]);
      8     int j ,i;
      9     for(i = 0; i < rows;++i)
     10     {
     11         for(j = 0;j < cols / 2;++j)
     12         {
     13             int temp = a[i][j];
     14             a[i][j] = a[i][cols - 1 - j];
     15             a[i][cols - 1 - j] = temp;
     16         }
     17     }
     18     for(i = 0; i < rows;++i)
     19     {
     20         for(j = 0;j < cols;++j)
     21         {
     22             printf("%4d",a[i][j]);                                                                                                                                               
     23         }
     24         printf("\n");
     25     }
     26     return 0;
     27 }      

  2. 二维字符数组的比较
      1 #include<stdio.h>
      2 #include<string.h>
      3 
      4 int main(void)
      5 {
      6     char s[][100] = {"Hello","World","China","America"};
      7     char max[100] ;
      8     int rows = sizeof(s) / sizeof(s[0]);                                                                                                                                         
      9     strcpy(max,s[0]);
     10     int i = 0;
     11     for(i = 1; i < rows;++i)
     12     {
     13 
     14         if(strcmp(s[i] , max) > 0)
     15         {
     16             strcpy(max, s[i]);
     17         }
     18     }
     19     puts(max);
     20     return 0;
     21 }
    

    3.二维字符数组的查找

  1 #include<stdio.h>
  2 #include<string.h>
  3 int main(void)
  4 {
  5     char s[][100] = {"Hello","World","China","America"};
  6     char room[100];
  7     char m[100] = "Hello";
  8     int rows = sizeof(s) / sizeof(s[0]);
  9     int i = 0;
 10     int j = 0;
 11     for(j = rows - 1;j > 0;--j)
 12     {
 13         for(i = 0 ; i < j;++i)
 14         {
 15             if(strcmp(s[i],s[i + 1]) > 0)
 16             {
 17                 strcpy(room , s[i]);
 18                 strcpy(s[i], s[ i + 1]);
 19                 strcpy(s[i + 1], room);
 20             }
 21         }
 22     }
 23     int begin = 0;
 24     int end = rows - 1;
 25     int mid;
 26 
 27     while(begin <= end)
 28     {
 29 
 30         mid = (begin + end) / 2;
 31         if(strcmp(s[mid],m) > 0)
 32         {
 33             end = mid - 1;
 34         }
 35         else if( strcmp(s[mid],m) < 0)
 36         {
 37             begin = mid +1;
 38         }
 39         else
 40             break;
 41     }
 42 
 43     if(begin <= end)
 44     {
 45         printf("%d\n",mid);
 46     }
 47     else
 48     {
 49         printf("no\n");
 50     }
 51      return 0 ;
 52 }  


总结

在使用字符串处理函数时,注意加上头文件<string .h>,以及目标数组的空间是否足够。要区分strlen函数和sizeof函数对于字符数组的结果代表的不同含义。在写字符数组和二维数组程序时,一定防止出现越界访问的情况。对于字符串处理问题,在数组中间出现‘\0’时(即结束符后还有其他元素),C语言会把结束符与后面的元素进行拼接,力求字符数组中有尽可能多的有效值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值