C语言笔记之利用数组处理批量数据

第六章

1.一维数组的定义和引用

- 定义一维数组

int a[10]

表示定义了一个整形数组,数组名为a,此数组有10个整型元素。定义一维数组的一般形式为 ==类型符 数组名[常量表达式]==

  • [注意]

    定义数组时,方括号中的常量表达式用来表示元素的个数,即数组长度。

    C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值,以下定义为不合法:

    int n;
    scanf("%d", &n);
    int a[n];
    

    如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式,在调用func函数式形参n从实参得到值。这种情况被称为“可变长数组”,允许在每次调用func函数时,n有不同的值。但是在执行函数时,n的值是不变的,数组长度是固定的。

    void func(int n){
        int a[2*n];
        ...
    }
    

    如果指定数组为静态(static)存储方式,则不能用“可变长数组”。如

    static int a[2*n];  //不合法,a数组指定为static存储方式
    

- 引用一维数组

引用数组元素的表示形式为 ==数组名[下标]==

a[0] = a[5] + a[7] + a[2*3];
  • [注意]

    定义数组时用到的 ==数组名[常量表达式]== 和 引用数组元素时用的 ==数组名[下标]== 形式相同,但含义不同。例如:

    int a[10]; //这里的a[10]表示定义数组时指定数组包含10个元素
    t = a[6];  //这里的a[6]表示引用a数组中序号为6的元素
    

- 初始化

在定义数组时对全部数组元素赋予初值。

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

只给一部分元素赋值,未赋值部分自动设为0

int a[10] = {0, 1, 2, 3, 4}; // 部分赋值

对全部数组元素赋初值时,由于个数已经确定,所以可以不指定数组长度。

int a[] = {0, 1, 2, 3, 4};

2.二维数组的定义和引用

- 定义二维数组

一般形式为 ==类型符 数组名[常量表达式][常量表达式]==

float a[3][6];  //第一维有3个元素,第二维有6个元素,分别用方括号括起来,即a为3x4(3行4列)的数组;
float a[3,4][5,10]; //不合法,一个方括号不能写两个下标;

-引用二维数组

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

a[2][3]; //表示a数组中序号为2的行中序号为3的列的元素,下标应该是单个整型表达式。

-初始化二维数组

分行给二维数组赋初值

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

int a[][4] = {{1, 2,3, 4}, {1, 2,3, 4}, {1, 2,3, 4}};//与上式效果相同

所有数据都写在花括号内,按顺序分配

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

int a[][4] = {1, 2,3, 4, 1, 2,3, 4, 1, 2,3, 4}; //与上式效果相同

对部分赋值

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

结果:
1 0 0 0
1 0 0 0
1 0 0 0

int a[3][4] = {{1}, {0, 1}, {0, 0, 1}}; //没有赋值的部分自动为0

结果:
1 0 0 0
0 1 0 0
0 0 1 0

int a[3][4] = {{1}, {}, {0, 0, 1}}; //第二行自动为0

结果:
1 0 0 0
0 0 0 0
0 0 1 0

3.字符数组

- 定义字符数组

用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。

char c[10]; //类似数值型数组

-初始化

初始化列表,列表中的初值个数不能大于数组长度,少于则自动定义为空字符(即'\0')。

char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y'};

char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y', '!'}; //不合法,超出数组长度会报错

char c[10] = {'I', '', 'a', 'm', '', 's', 'a', 'd'}; //  c[8]=c[9]='\0', 结果:I am sad\0\0

- 引用字符数组

引用一个元素得到一个字符

# include <stdio.h>
int main()
{
    char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]、c[4]中的单引号内有空格;
    int i;
    for(i=0; i<10; i++)
    printf("%c", c[i]);
    printf("\n");
    return 0;
}

运行结果:
I am happy.

- 关于字符串和字符串的结束标志

使用字符串常量对字符数组进行初始化

char c[] = {"I am happy."}; //将单撇号变为双撇号表示字符串
char c[] = "I am happy."; //效果同上

实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。为了测试字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符‘\0’作为结束标志。也就是说在数组中遇到字符‘\0’,表示字符串结束,把它前面的字符组成一个字符串。系统在处理字符串常量存储时会自动加一个‘\0’。

char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y'};
输出:happyram

char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y', '\0'}; //手动加一个‘\0’,新旧字符就不会连在一起
输出:happy

- 字符数组的输入输出

逐个字符输入输出,使用格式符‘%c’;

# include <stdio.h>
int main()
{
    char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]、c[4]中的单引号内有空格;
    int i;
    for(i=0; i<10; i++)
    printf("%c", c[i]);
    printf("\n");
    return 0;
}

运行结果:
I am happy.

将整个字符串一次输入或输出,使用格式符‘%s’;

char c[] = {"China"};
printf("%s",c);   //printf函数中的输出项是字符数组名,而不是数组元素名
运行结果:
China
  • [拓展]

    可以使用scanf函数输入一个字符串

    char c[];
    scanf("%s", c); //c必须是已定义的字符数组名;
    
    char str1[],str2[],str3[];
    scanf("%s%s%s", str1, str2, str3); //输入时应以空格分隔字符串;
    

    scanf函数中的输入项如果是字符数组名,不要再加地址符‘&’,因为C语言中的数组名代表该数组的起始地址

    printf("%o",c); //“%o”格式符可根据数组名输出数组的起始地址;
    
    printf("%s",c); //按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到‘\0’为止;
    

-字符串处理函数

  1. puts函数——输出字符串的函数。

    char str[] = "China\nBeijing";
    puts(str);//可以包括换行符
    
    运行结果:
    China
    Beijing
    
  2. gets函数——输入字符串的函数gerts(str);

  • [puts和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2)]
  1. strcat函数——字符串连接函数 strcat(str1, str2)

    char str1[30] = {"People's Republic of"};
    char str2[] = {"China."};
    printf("%s", strcat(str1, str2));
    
    运行结果:
    People's Republic of China.
    
  2. strcpy和strncoy——字符串复制函数strcpy(str1, str2)

    strcpy将str2复制到str1中去

    char str1[10], str2[]="China";
    strcpy(str1, str2);
    
    运行结果:
    China\0\0\0\0\0;
    

    strncpy将str2最前面的n个字符复制到str1中,取代str1中原有的最前面n个字符。strncpy(str1, str2, n);

  3. strcmp函数——字符串比较函数strcmp(str1, str2);

    将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),知道出现不同的字符或遇到‘\0’为止。若出现不同的字符,则以第一对不相同的字符比较结果为准,位置在后面为大。

    • str1==str2,返回0;
    • str1>str2,返回一个正整数;
    • str1<str2,返回一个负整数;
    if(strcmp(str1,str2)>0);
    printf("yes");
    
  4. strlen——测字符串长度的函数,指实际长度,不包括‘\0’。

    char str[10] = "China";
    printf("%d", strlen(str));
    运行结果:
    5
    
  5. strlwr——转换为小写的函数。strlwr(str)

  6. strupr——转换为大写的函数。strupr(str)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,635评论 3 71
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,430评论 3 44
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,905评论 2 13
  • 一、字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 s...
    JaiUnChat阅读 1,655评论 0 7
  • 我今天和陈霞坐在篮球场看球赛 球赛打得太烂于是我就开始看半场 看着那几个打球的哥们儿跳投 转身 后仰 我还发现其中...
    晃走可乐的气阅读 319评论 0 0