Linux基础32-C语言篇之二维数组案例与字符数组【入门级】

数组

二维数组

案例

案例1:

  • 需求:二维数组的遍历

  • 代码:

    #include 
    int main(int argc,char *argv[])
    {
        // 创建一个二维数组,经过论证,二维数据组必须指定列的大小,行的大小可以省略
        int arr[][3] = {{11},{21,22},{31,32,33}};
        // 获取二维数组的大小
        int r_len = sizeof(arr) / sizeof(arr[0]);
        // 遍历二维数组
        // 外层循环,遍历行元素(行元素是数组类型)
        for (int row = 0; row < r_len; row++)
        {
            // 获取行元素中列元素的个数
            int c_len = sizeof(arr[row]) / sizeof(int);
            // 内层循环,遍历列元素(列元素是单一类型)
            for (int col = 0; col < c_len; col++)
            {
                // 获取元素
                printf("%-3d",arr[row][col]); // 意思是获取数组arr第row行第col列
            }
        }
        printf("\n");
        return 0;
    }
    

案例2:

  • 需求:矩阵的转置(将1个2行3列的数组转换为3行2列的数组)

  • 代码:

    #include 
    // 定义行和列
    #define ROW 2
    #define COL 3
    int main(int argc,char *argv[])
    {
        // 准备2个数组用来存放转置前后的数列
        int arr_before[ROW][COL] = {{11,12,13},{14,15,16}};
        int arr_after[COL][ROW] = {0};
        // 计算arr_before的大小
        int r_len = sizeof(arr_before) / sizeof(arr_before[0]);
        // int c_len = sizeof(arr_before[0]) / sizeof(arr_before[0][0])
        // 遍历
        for (int i = 0; i < r_len; i++)
        {
            // 计算arr_before中行中的列数
            int c_len = sizeof(arr_before[i]) / sizeof(int);
            for (int j = 0; j < c_len; j++)
            {
                printf("%-4d",arr_before[i][j]);
                // 转置
                arr_after[j][i] = arr_before[i][j];
            }
            printf("\n");
        }
        printf("\n");
        // 遍历
        for (int i = 0; i < sizeof(arr_after)/sizeof(arr_after[0]);i++)
        {
            for (int j = 0; j < sizeof(arr_after[i]) / sizeof(int); j++)
            {
                printf("%-4d",arr_after[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        return 0;
    }
    

字符数组

概念

元素类型为char类型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们C语言中的字符是字节字符。

字节字符:也就是1个字符占1个字节,在C语言中,我们使用char表示字节。

测试题:

char a = 'A';//正确
char b = '1';//正确
char c = 65;//正确
char d = "A";//错误
char e = '汉';//错误,中文一个字符超过了1个char

C语言支持字符串常量,不支持字符串变量

语法
char 数组名[容量];
char 数组名[行容量][列容量]

字符数组的语法就是我们前面所学的一维数组和二维数组的语法,只不过数组的类型是char而已。

注意:

​ 如果我们的数组char数组初始化的时候,没有完全初始化值的时候,空出来的地方使用\0进行填充。注意这里的·\0只是起到占位的作用,无法通过printf进行输出。

比如:

char c[8] = {'h','e','l','l','o'};//等价于
char c[8] = {'h','e','l','l','o','\0','\0','\0'};
案例

案例1:

  • 需求:输出一个字符序列(I LOVE YOU!)

  • 代码:

     #include 
    int main(int argc,char *argv[])
     {
        // 创建一个数组,用来存储 I LOVE YOU  ASCI中32对应的就是空格' '
        char arr[10] = {'I',' ','L','O','V','E',32,'Y','O','U'};
        // 使用for循环遍历数组
        for(int i = 0; i < sizeof(arr)/sizeof(char); i++)
        {
            printf("%c",arr[i]);
        }
        printf("\n");
        return 0;
     }
    

案例2:

  • 需求:输出一个用字符组成的菱形图案

  • 代码:

    #include 
    int main(int argc,char *argv[])
    {
        // 准备数据
        char arr[5][5] = {
            {' ',' ','*',' ',' '},
            {' ','*','*','*',' '},
            {'*','*','*','*','*'},
            {' ','*','*','*',' '},
            {' ',' ','*',' ',' '}
        };
        // 遍历数组
        for (int i = 0;i < sizeof(arr)/sizeof(arr[0]); i++)
        {
            for (int j = 0; j < sizeof(arr[i])/sizeof(char); j++)
            {
                printf("%c",arr[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        return 0;
    }
    

注意:

①如果定义时不初始化,元素值不确定

char arr1[2];//此时属于未初始化,元素的值不确定,大概率是0
char arr2[5] = {'a','b','c'};//此时属于不完全初始化,未初始化的元素使用\0进行填充

②如果提供的字符个数大于数组长度,则按照语法错误处理;如果字符个数小于数组长度,后面的元素自动为空字符(\0)

③如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素个数,适合字符较多时。

字符串结束标志
说明
  • C语言规定字符串以字符\0作为结束标志。

  • 编译系统对字符串常量自动加一个\0作为结束标志。

  • 程序中往往通过判断\0来检测字符串是否结束。

  • \0的ASCII码是0,不是一个可显示的字符,是“空操作符”,它什么都不做,不会增加有效字符,仅是一个工程判别的标志。

    char c[] = {'h','i'};//字符
    char c[] = {'h','i','\0'};//字符串
    char c[] = "hello";//实际等价于hello\0
    
     // \0(空字符),ASCII码是0
     // 0 , ASCII码是48
     // 空格,ASCII码是32
    
字符数组的多样表示

我们的char数组可以以数组的形式一个个输出每个字符:我们的char数组也可以以字符串的方式整体进行输出所有字符。

案例:

#include 
int main(int argc,char *argv[])
{
    // 字符串的第1种表示:
    char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
    // 字符串的第2种表示:
    char s2[] = {"hello world"};// 字符串常量默认以\0结尾
    // 字符串的第3种表示:
    char s3[] = "hello world";
}
// 输出字符串
printf("%s\n%s\n%s\n",s1,s2,s3);
return 0;

注意:

  • 字符串长度与字符数组的长度不一定相同

  • 利用字符串常量可以对字符数组进行初始化,但不能通过字符串常量对字符数组赋值。

    // 正确演示:利用字符串常量给字符数组初始化
    char arr1[6] = "hello";
    
     // 错误演示:用字符串常量为字符数组赋值
    char arr2[6];
     arr2 = "hello"; 
    

你可能感兴趣的:(linux,c语言,算法)