C语言中的数组和字符串

一、引子

       我们学习了C语言了,我们可能会想知道如果我们有一列数字,或者其他的同种类型的一长串的数据,如果我们还是按照以往的设置变量,给每个变量赋值。这样显然时可行的,但是如果我们有10个甚至更多的数据,这样去定义似乎就有点愚蠢了,然后数组就正好能够胜任这个工作了。至于我们有上万的数据,这个另当别论,可以导入文件这种进行操作。我们单纯地介绍数组的这种情况。

二、数组的相关概念

      数组是由数据类型相同的一系列元素组成,需要使用数组的时候,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。

      如何创建一个数组:

int arr[5] = { 1,5,6,7,8 };

      如何创建一个只读数组:(注意这里有一个const,这个我后期会对他进行解释。)

const int arrt[5] = { 4,8,9,12,6 };

     这里因为我们给数组赋予了相应数量的值,问题来了,如果我们在数组中提供的值小于数组大小的话,会产生什么效果呢?如果是更大呢?第一个问题答案是它会自动给未赋值的数组值赋值未0,第二个就直接报错了。然后这里需要提一下,就是如果我们有一组数据是这样的:0,0,0,0,122,0我们可以这样赋值来节省时间。

int arr[6] = { };
    arr[4] = 122;

 

     上面介绍的都是一维数组的例子,现在我们来介绍一下二维数组的例子。

     二维数组和一维数组类似,实际上使用的方式也是类似的:

#include<stdio.h>
int main(void)
{
    int arr[6][6] = { };
    arr[4][2] = 122;
    arr[3][3] = 15;
    int i,j;
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 6; j++)
        {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

     然后数组的相关知识是讲完了。它的实际应用需要和指针,函数结合在一起进行阐述。在指针中实际上只需要记住一个点,就是数组名就是该数组首元素的地址,这给了我们利用指针调用数组中的元素提供了方便。然后我们数组爱函数中实际上还可以作为形参。这也就意味着这两种形式都是可行的:(需要注意的是,只有在函数原型或者函数定义里面,才能用int ar[]代替int *arr[]

int sum(int *arr, int n);
int sum(int arr[], int n);

       然后,我们可能回想,我们能不能创建一个变长数组?答案是可以的。

       但是这个变长的意思是说我们在创建数组的时候,可以通过使用变量来指定数组的维度,不是说可以随意的改变数组的长度这样子。

      补充:然后我们实际上还可以使用malloc+free进行。

malloc的定义方法为:

    double * ptd;
    ptd = (double*)malloc(30 * sizeof(double));
    free(ptd);

 

malloc就是我们可以在使用的时候才对它进行输入所需要的内存大小,然后如果我们这个变量用完了,就得free掉这段内存,不然这段内存就会一直存放在电脑里面。

三、字符数组

     用来存放字符数据的数组是字符数组,字符数组的一个元素存放一个字符。类似的定义以及引用如下:

char arr[10] = { 'I','L','O','V','E','Y','O','U' };
    int i;
    for (i = 0; i < 10; i++)
    {
        printf("%c\n", arr[i]);
    }

 

     说到字符数组,就将字符串一起解释:

    字符串的结束系统是会自动加上一个‘\0’.常用的字符串处理函数包括:(注意,下面这些函数,均需要加头文件string.h才可以使用)

(1)puts(str)函数——输出字符串的函数

    char arr[20] = "string";
    puts(arr);

 

(2)gets(str)函数——输入字符串的函数(注意这个函数可能有的情况下无法使用,如果不能使用,可以考虑使用gets_s(str)函数

    char arr[20];
    gets_s(arr);
    puts(arr);

 

(3)strcat(str1,str2)函数——字符串连接函数,会把str2加到str1上去,这个函数无法计算str1中是否能容纳下str2。

    char str1[20] = { "string" };
    char str2[20] = { "usuuss" };
    printf("%s", strcat(str1,str2));

 

   为了解决上面的那个问题,我们可以使用strncat来进行相关操作:strncat(str1,str2,n)中的n是说在str1中的最大添加字符数。例如:

    char str1[10] = { "string" };
    char str2[10] = { "usuuss" };
    printf("%s", strncat(str1,str2,2));

注意,这里要是把n设置为了6,因为6+6>10,所以会报错。

(4)strcpy(str1,str2)和strncpy(str1,str2,n)函数

   第一个是说将str2复制到str1中去。第二个是说将str2中的n个元素复制到str1中去。

(5)strcmp(str1,str2)函数——字符串比较函数

    char str1[10] = { "string" };
    char str2[10] = { "usuuss" };
    printf("%d\n", strcmp(str1, str2));

 

如果str1>str2,返回1;str1=str2,return 0;str1<str2 return -1;

(6)strlen(str)函数——测字符串长度的函数

(7)strlwr函数——转换为小写的函数(如果strlwr或者strupr无法使用,请换成_strlwr和strupr)

    char str1[10] = { "string" };
    char str2[10] = { "uAuUss" };
    printf("%s\n", _strlwr(str1));
    printf("%s\n", _strupr(str2));

 

(8)strupr函数——转换为大写的函数

然后数组的相关知识也讲完了,现在就对上面提到的const进行解释。const的意思是说这个变量或者参数不能够修改,这个和使用#define指令有点类似,但是const会更加灵活。我们可以使用const来创建const 数组,const指针和指向const的指针。需要强调的是吧const指针或非const数据的地址初始化为指向const的指针或为其赋值是合法的,然而,只能把非const数据的地址赋给普通指针。这里需要进行一个辨析:就是const和*的位置的问题,如果const在*左边,限定了指针指向的数据不能改变,如果在右边,那么就是指针本身不能够改变

 

posted @ 2022-03-24 13:50  Tomhard  阅读(118)  评论(0编辑  收藏  举报