• 【C语言】利用数组处理批量数据(字符数组)


    前言:前面已经介绍了,字符数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。

    💖 博主CSDN主页:卫卫卫的个人主页 💞
    👉 专栏分类:C程序设计谭浩强版本 👈
    💯代码仓库:卫卫周大胖的学习日记💫
    💪关注博主和博主一起学习!一起努力!
    在这里插入图片描述



    怎样定义字符数组

    用来存放字符数据的数组是字符数组。在字符数组中的一个元素内存放一个字符。定义字符数组的方法与定义数值型数组的方法类似。例如:

    char c[10];
    c[0] ='I'; c[1] =' '; c[2] ='a'; c[3] ='m'; c[4] = ' '; 
    c[5] = 'h'; c[6] ='a'; c[7] ='p'; c[8] = 'p'; c[9] = 'y';
    
    • 1
    • 2
    • 3

    以上定义了c为字符数组,包含了10个元素。赋值以后数组的状态如下图所示:

    在这里插入图片描述
    由于字符型数据是以整数的形式(ASCII代码)存放的,因此也可以用整型数组来存放数据,例如:

    int c[10];
    c[0] = 'a';
    //虽然合法,但是浪费空间
    
    • 1
    • 2
    • 3

    字符数组的初始化

    对于字符数组的初始化,最容易理解的方式就是用"初始化列表",把各个字符赋给数组中的各个元素。例如:

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

    把10个字符依次赋给c[0] ~c[9] 这10个元素。

    如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值的个数(即字符个数)大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(‘\0’),例如:

    char c[10] = { 'a','b','c',' ','d','m','y','h' };
    
    • 1

    数组状态如下图所示:
    (Vscode2019)下的状态
    在这里插入图片描述
    如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值的个数确定数组长度。例如:

    int main()
    {
    	char c[] = { 'a','b','c',' ','d','m','y','h' };
    	printf("数组的长度是%d\n", sizeof(c)/sizeof(c[0]));//计算数组的长度
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果:
    在这里插入图片描述


    怎样引用字符数组中的元素

    可以引用字符数组中的一个元素,得到一个字符。
    例题:输出一个已知字符

    int main()
    {
    	char c[15] = { 'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t'};
    	int i = 0;
    	for (i = 0; i < 15; i++)
    	{
    		printf("%c", c[i]);
    	}
    	printf("\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述


    例题2:输出一个菱形

    int main()
    {
        int line = 0;
        scanf("%d", &line);
        //打印上半部分;
        int i = 0;
        for (i = 0; i < line; i++)
        {
            //打印一行
            //打印空格
            //打印*
            int j = 0;
            for (j = 0; j < line  - 1 - i ; j++)
            {
                printf(" ");
            }
            //打印*
            for (j = 0; j < 2 * i + 1 ; j++)
            {
                printf("*");
            }
            printf("\n");
        }
        //下
        for (i = 0; i < line - 1; i++)
        {
            //打印一行
            //打印空格
            //打印*
            int j = 0;
            for (j = 0; j <= i; j++)
            {
                printf(" ");
            }
            //打印*
            for (j = 0; j < 2 *(line - i - 1)- 1; j++)
            {
                printf("*");
            }
            printf("\n");
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    运行结果:
    在这里插入图片描述


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

    在C语言中,是将字符串作为字符数组来处理的。在实际工作中,人们关心的往往是字符串的有序长度。例如,定义一个字符数组的长度为100,而实际有效字符只有40个。为了测定字符串的实际长度,C语言规定了一个"字符串结束标志",以字符’\0’作为结束标志。如果字符数组中有若干字符前面9个字符都不是空字符(‘\0’),而第十个字符是‘\0’,则认为该数组中有一个字符串,其有效字符为9个。也就是说,遇到字符‘\0’ 时,表示字符串结束,把前面的字符组成一个字符串。

    对于C语言处理字符串的方法有以上的了解后,再对字符数组初始化的方法补充了一种方法,即用字符串常量来使字符数组初始化。例如:

    char c[] ="I am a student";
    
    • 1

    这里不像前面用单个字符作为字符数组的初始值,而是用一个字符串(注意字符串的两端是双撇号而不是单撇号扩起来的)作为初值。显然这种方式更加直观、方便、符号人们的习惯。请注意,此时c的长度不是14,而是15。因为字符串常量的最好由系统加上一个’\0’。

    int main()
    {
    	char c[] = "I am a student";
    	printf("sz = %d\n", sizeof(c) / sizeof(c[0]));//计算长度(包括\0)
    	printf("len = %d\n", strlen(c));//计算长度(不包括\0)
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果:在这里插入图片描述

    (这里关于sizeof和strlen的区别就不具体说明,有感兴趣的可以看我之前文章,详细讲解了strlen与sizeof)关于strlen与sizeof


    字符数组的输入输出

    字符数组的输入输出可以有两种方法。

    1. 逐个字符输入输出。用格式符"%c"输入或输出一个字符如下图
    2. 将整个字符串一次输入或输出。用"%s"格式符,意思是对字符串(string)的输入输出。例如:
    	char c[] = "china";
    	printf("%s\n", c);
    
    • 1
    • 2

    在内存中数组c的存储情况为:
    在这里插入图片描述

    输出时,遇到’\0’就停止输出。输出结果为:
    在这里插入图片描述

    用字符串处理函数

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

    puts函数 – 输出字符串的函数

    其一般形式为
    puts(字符数组)
    其作用是将一个字符串(以’\0’作为结束的字符序列)输出到终端,且puts函数输出使将字符串的结束标志’\0’转换成了’\n’,即输出完字符串后换行
    例如:

    int main()
    {
    	char c[] = "china";
    	puts(c);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果:

    在这里插入图片描述


    gets函数 – 输入字符串

    其一般形式为:
    gets(字符数组)
    其作用是从终端输入一个字符串到字符数组,并得到一个函数值。该函数值是字符数组的起始地址。
    例如:

    int main()
    {
    	char c[10] = { 0 };
    	gets(c);
    	puts(c);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果:在这里插入图片描述


    • strcat函数 – 字符串连接函数
    • strcpy函数与strncpy函数 – 字符串复制函数
    • strcmp函数 – 字符串比较函数

    关于这些函数的讲解在这里我也不过多介绍了,各位可以点这个连接跳转到我前面的博客,里面详细讲解了这几个函数并且如何模拟实现这些函数。
    字符串函数的讲解与模拟实现


    字符数组应用举例

    例题:输入一行字符,统计其中有多少单词,单词之间用空格隔开。
    方法1:

    int main()
    {
    	char arr[20] = { 0 };
    	gets(arr);
    	char* str = arr;
    	int count = 0;
    	int i = 0;
    	while (*str)//判断'\0'
    	{
    		if (*str != ' ')//找出非空格的数
    		{
    			count++;
    		}
    		str++;
    	}
    	printf("%d\n", count);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法2:

    int main()
    {
    	char arr[20] = { 0 };
    	int i = 0;
    	int count = 0;
    	gets(arr);
    	for (i = 0; i < 20; i++)//变量数组
    	{
    		if (arr[i] != '\0' && arr[i] != ' ')
    		{
    			count++;
    		}
    	}
    	printf("%d\n", count);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行结果:在这里插入图片描述


    结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。

    🫵🫵🫵 祝各位接下来好运连连 💞
  • 相关阅读:
    蓄电池建模、分析与优化(Matlab代码实现)
    入门力扣自学笔记204 C++ (题目编号:1742)
    西瓜书-2.5偏差与方差
    计算机网络 | 计算机网络体系结构
    Integritee通过XCM集成至Moonriver,为其生态系统带来企业级隐私解决方案
    not_the_same_3dsctf_2016【简单解法和mprotect解法】
    R语言绘制动态网络图Network教程WGCNA
    [WinError 1455] 页面文件太小,无法完成操作和RuntimeError: CUDA out of memory
    setState同步异步场景
    找工作八股文----《操作系统》
  • 原文地址:https://blog.csdn.net/m0_64826370/article/details/133611435