Post

数组

一维数组

定义:

类型说明 数组名[常量表达式]

要求:

  • 遵循标识符命名规则
  • 下标是从常量表达式 ,从0开始
  • 常量表达式字面意思,但是千万注意不能是变量

引用:

数组名[下标]

  • 下标:可以是整型常量表达式 或者 整型表达式

初始化:

1
2
3
4
5
6
7
8
9
10
11
12
//1.定义数组对全部数组赋值
int a[5]={0,1,2,3,4};

//2.只给数组一部分元素赋值
//给后面两个元素赋初值为0
int a[5] = {0,1,2};

//3.给数组全部赋值为0
int a[10] = {0};

//4.对于确定的元素,可以不指定数组的长度
int a[] = {0,1,2,3,4};

Tips: 对于仅指定了数组长度的,但未初始化值的数组

  • 普通数组: 对于数组的元素置为0
  • 字符型数组: 初始化为’\0’
  • 指针型数组: 初始化为NULL(即空指针)

二维数组

定义:

类型说明符 数组名[常量表达式][常量表达式]

  • 二维数组中元素排序的顺序是按行排序
  • 矩阵形式表示二维数组是逻辑上的概念,在内存中,各个元素连续、线性存放的

引用:

数组名[下标][下标]

  • 下标上整形表达式
  • 下标的值应在已定义的数组大小范围内(出现数组越界,数值未知)

初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//1.手动分行赋值
int a[3][4]={ {1,2,3},{4,5,6},{7,8,9}};

//2.直接赋值(系统自动分行)
int a[3][4]={1,2,3,4,5,6,7,8,9};

//3.部分赋值
int a[3][4] = { {1},{5},{9}};

//4.对每行指定元素赋值
int a[3][4] = { {1},{0,6},{0,0,11}};

//5.对某行元素进行赋值
int a[3][4] = { {1},{5,6}};

//6.指定某行不赋值
int a[3][4] = { {1},{},{9}};

//7.省略一维长度(二维长度不能省略)
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

//8.最懒的写法
int a[][4] ={ {1,2,3},{},{0,10}};

用例p152

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void two_dimension_swap_r_c()
{
    int a[2][3] = { {1,2,3},{4,5,6}};
    int b[3][2],i,j;

    printf("array a:\n");
    for(i=0;i<=1;i++)
    {
        for(j=0;j<=2;j++)
        {
            printf("%5d",a[i][j]);
            b[j][i] = a[i][j];
        }
        printf("\n");
        }
        printf("array b:\n");
        for(i=0;i<=2;i++)
        {
            for(j=0;j<=1;j++) printf("%5d",b[i][j]);
        printf("\n");
        }
        
    
}

字符数组

c99标准中 --- 字符类型 被归纳为 整形类型

定义:

1
2
char c[10];
c[0] = 'I'

初始化:

  • 初始化个数 大于 数组长度 —> 语法错误
  • 初始化个数 小于 数组长度 —> 自动补\0
1
2
3
4
5
//1.普通版本
char c[10] = {'c',' ','p','o'};

//2.省略数组长度
char c[] ={'c','p','o'};

引用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//实例:输出一个菱形图
void out_rhombus()
{
    char diamond[][5] = {
        {' ',' ','*'},
        {' ','*',' ','*'},
        {'*',' ',' ',' ','*'},
        {' ','*',' ','*'},
        {' ',' ','*'}
        };

        int i,j;
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
                printf("%c",diamond[i][j]);
            printf("\n");
        }
        
}

字符串:

  • 本质是:一维数组
  • 区别:字符数组存储字符串时,会自动加上一个\0,代表结束
  • printf函数:通过检测\0来结束输出

字符串常量使字符数组初始化

1
2
3
4
5
//形式1
char c[] = {"you are foolish"};

//形式2
char c[] = "you are foolish";

字符数组和字符串的区别:

  • 字符数组:不要求最后一个字符时\0 — 合法
  • 字符串: 自动添加\0

字符数组的输入输出:

  • 逐个字符输出 %c
  • 将整个字符串一次性输出 %s

TIPS:

  • printf()

    • 输出不包括结束符\0 ,并且只输出到\0
    • 如果包含多个\0 ,按照第一个为准
  • scanf()

    • 输入项c –[已定义的字符数组名] 应短于已经定义的字符数组的长度

    • 如果利用scanf输入多个字符串,应该用空格分开

      1
      2
      3
      4
      
      char str1[5],str2[5],str3[5];
      scanf("%s%s%s",str1,str2,str3);
          
      //输入===> How are you?
      
    • 空格:系统会默认为分隔符

<string.h>中的库函数

  • puts(字符数组): int puts(const char *str) 如果成功,则返回非负值。如果出错,函数返回 EOF。

    • puts输出自动将\0替换为\n
  • gets(字符数组): char *gets(char *str) 该函数成功时返回 str,出错或文件结束时返回 NULL,同时没有读取任何字符。

    • 1
      2
      3
      
      get(str);
      //输入 ===> Computer
      //tips:这里输入的9个字符,要算上\0	
      
    • puts & gets 都只能输出、输入一个字符串!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{   
    char *str[50];
    gets(str);
    puts(str);

    char a;
    a = getc(stdin);
    putc(a,stdout);\
    return 0;
}
  • strcat(字符数组1,已经赋值的字符数组2/字符串) cahr * strcat(char *dest,const char *src)

    • 【catenate】:vt.形成锁链
    • str2 ===合并到===》 str1
    • 这里注意str1的长度要够,不要出现数组越界
  • strcpy(字符数组1,已经赋值的字符数组2/字符串) char* strcpy(char* destination, const char* source);

    • 1
      2
      3
      
      char str[10],str2[] = "China";
      strcpy(str1,str2);
      // str2 ===合并===》 str1
      
      • tips:
        • 字符数组1:必须是数组名形式
        • 字符串2:可以是字符数名,也可以是一个字符串常量
        • 不能将 一个字符串常量或字符数组 ==直接给 ===> 一个字符数组 [字符数组名 – 一个地址常量,不能改变其值] , 只能用strcpy来复制
  • strncpy(str1,已经赋值的字符数组2/字符串,num) char * strncpy ( char * destination, const char * source, size_t num );

    • num:将str2前num个字符复制到str1中
  • strcmp(字符串1字符串2) int strcmp (const char* str1, const char* str2);

    • 从左到右进行逐个字符比较
      • str1 = str2 ===> 0
      • str1 > str2 ===> 一个正整数
      • str1 < str2 ===> 一个负整数
  • strlen(字符数组)

    • 返回长度不包括\0
  • strlwr(字符串) char *strlwr(char *str);

    • LoWeRcase:转换为小写
  • strupr(字符串) char *strupr(char *str);

    • UPpRcase:转换为大写
This post is licensed under CC BY 4.0 by the author.