C语言-04数组和字符串

目标

  • 1、C语言中数组的概念和使用

  • 2、C语言中的多维数组

  • 3、C语言中字符串的概念和使用

  • 4、C语言中字符串处理函数(复制、连接)

  • 5、C语言中字符串处理函数(比较、长度)

  • 6、C语言中字符串处理函数(转换)

1、C语言中数组的概念和使用

在C语言中,数组是一种复合数据类型,可以存储固定大小的同类型元素的序列。数组可以是一维的(即线性数组),也可以是多维的(例如二维的网格数组或者三维的立方体数组等)。

数组的使用在C语言编程中非常常见,无论是存储一系列的数值,还是字符串(字符数组),甚至更复杂的数据结构,如结构体数组等。

1.1 定义和初始化数组

在C语言中,我们可以定义一个数组,如下所示:

int arr[10]; // 定义一个可以存放10个整数的数组

在定义数组的时候,可以对它进行初始化:

int arr[5] = {1, 2, 3, 4, 5}; // 定义并初始化一个数组

如果在初始化的时候没有给出数组的大小,编译器会根据初始化的元素数量自动确定:

int arr[] = {1, 2, 3, 4, 5}; // 定义并初始化一个数组,大小为5

1.2 访问数组元素

可以通过索引来访问数组元素,索引从0开始,即第一个元素的索引为0,第二个元素的索引为1,以此类推。例如:

int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[0]); // 输出第一个元素,结果为1

1.3 数组遍历

一般情况下,可以通过循环来遍历数组中的所有元素。例如,如果要输出数组中的所有元素,可以使用如下代码:

int arr[5] = {1, 2, 3, 4, 5};
int i;
for(i = 0; i < 5; i++) {
    printf("%d\n", arr[i]); // 输出每个元素
}

需要注意的是,访问数组时必须确保索引不超过数组的大小,否则会产生未定义行为。

2、C语言中的多维数组

在C语言中,除了一维数组外,还可以定义多维数组。最常见的就是二维数组,常常被用来表示表格或者矩阵。多维数组的定义和使用方式基本上和一维数组类似,但是在索引元素的时候需要指定更多的索引。

2.1 定义和初始化多维数组

在 C 语言中,可以使用多种方式来定义多维数组。在下面的例子中,我将演示如何使用不同的方式来定义一个二维数组:

标准定义方式:直接在声明时指定数组的大小。

int array[2][3]; // 定义了一个 2 行 3 列的二维整数数组

初始化时定义:在定义时直接初始化数组。

int array[2][3] = { {1, 2, 3}, {4, 5, 6} }; // 定义并初始化二维数组

部分初始化定义:定义时只初始化部分元素,其余元素默认为0。

int array[2][3] = { {1, 2}, {4} }; // 未初始化的元素值为0

省略行大小定义:在初始化时可以省略行的大小。

int array[][3] = { {1, 2, 3}, {4, 5, 6} }; // 行的大小通过初始化元素的个数决定

请注意,在 C 语言中,多维数组的行和列的大小必须是一个已知的常量,不能是变量。如果你需要一个行或列大小可以改变的数组,那么你可能需要使用到动态内存分配(比如使用 malloccalloc 函数)或者使用一维数组的数组(数组的指针)来模拟多维数组。

2.2 访问多维数组元素

访问多维数组元素时,需要为每一维指定索引:

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
printf("%d\n", matrix[0][2]); // 输出第一行第三列的元素,结果为3

2.3 多维数组的遍历

遍历多维数组一般需要使用嵌套循环。例如,打印出二维数组中的所有元素:

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
int i, j;
for(i = 0; i < 2; i++) {
    for(j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]); // 输出每个元素
    }
    printf("\n"); // 每一行结束后换行
}

以上的代码将会输出:

1 2 3
4 5 6

注意:和一维数组一样,访问多维数组时必须确保所有的索引都不超过数组的大小,否则会产生未定义行为。

3、C语言中字符串的概念和使用

在 C 语言中,字符串被视为字符数组的特殊情况。C 语言中没有专门的字符串类型,而是使用字符数组来表示和操作字符串。下面来具体说明一下。

3.1 字符串的概念

在 C 语言中,字符串是由多个字符组成的一系列字符序列,以空字符(‘\0’)作为结束标志。字符串通常被存储在字符数组中,数组的最后一位存放这个空字符。例如,字符串 “Hello” 在 C 中被表示为字符数组 {'H', 'e', 'l', 'l', 'o', '\0'}

字符串的使用

定义和初始化字符串

定义和初始化字符串有多种方式。最常见的是直接使用字符串字面量进行初始化:

char str[] = "Hello";

上述代码定义了一个名为 str 的字符数组,并用字符串 “Hello” 对其进行初始化。数组的长度自动设置为6,其中包括5个字符和一个结尾的空字符。

字符串的输入和输出

可以使用 printfscanf 函数来进行字符串的输出和输入:

char str[50];
printf("Enter a string: ");
scanf("%s", str);  // 输入字符串
printf("You entered: %s", str);  // 输出字符串

注意,当使用 scanf 函数输入字符串时,它会在遇到空白字符(如空格、制表符或换行符)时停止读取。如果要读取一行(包含空格的字符串),需要使用 fgets 函数。

字符串函数

C 标准库 <string.h> 提供了一系列操作字符串的函数,如 strlen(获取字符串长度)、strcpy(复制字符串)、strcat(连接字符串)、strcmp(比较字符串)等。

#include <string.h>

char str1[10] = "Hello";
char str2[10];
int len = strlen(str1);  // 获取字符串长度
strcpy(str2, str1);  // 复制字符串
strcat(str1, str2);  // 连接字符串
int cmp = strcmp(str1, str2);  // 比较字符串

4、C语言中字符串处理函数(复制、连接)

4.1strcpy

  • 头文件#include <string.h>
  • 函数原型char *strcpy(char *dest, const char *src);
  • 功能:该函数用于将字符串 src(包括 ‘\0’ 终止字符)复制到 dest 中。
  • 参数
    • dest:目标字符串,即复制到的地方。
    • src:源字符串,即需要复制的字符串。
  • 返回值:函数返回 dest,即目标字符串。

示例程序

#include <string.h>
#include <stdio.h>

int main()
{
    char src[40];
    char dest[100];

    memset(dest, '\0', sizeof(dest));
    strcpy(src, "This is example");
    strcpy(dest, src);

    printf("Final copied string : %s\n", dest);
    
    return 0;
}

在这个示例程序中,src 字符串 “This is example” 被复制到 dest 字符串中。然后,打印 dest 字符串,输出 “Final copied string : This is example”。

4.2strcat 函数

  • 头文件#include <string.h>
  • 函数原型char *strcat(char *dest, const char *src);
  • 功能:该函数用于将 src 字符串(包括 ‘\0’ 终止字符)连接到 dest 的末尾。
  • 参数
    • dest:目标字符串,即要被添加内容的字符串。
    • src:源字符串,即要添加的字符串。
  • 返回值:函数返回 dest,即目标字符串。

例程

#include <string.h>
#include <stdio.h>

int main() {
    char dest[30] = "Hello";
    char src[] = ", World!";

    strcat(dest, src);

    printf("源字符串: %s\n", src);
    printf("目标字符串: %s\n", dest);

    return 0;
}

在这个例程中,源字符串 “, World!” 被连接到目标字符串 “Hello” 的末尾。然后,打印源字符串和目标字符串。输出结果将是:

源字符串: , World!
目标字符串: Hello, World!

3. strlen

  • 头文件#include <string.h>

  • 函数原型size_t strlen(const char *str);

  • 功能: 此函数用于获取字符串的长度,也就是从字符串的开始到遇到第一个空字符(‘\0’)的字符数。注意,这个长度不包括空字符(‘\0’)本身。

  • 参数

  • str:指向要获取长度的字符串的指针。

  • 返回值: 此函数返回字符串的长度(不包括结束字符’\0’)。返回值的类型是 size_t,这是无符号整数类型,用于表示对象的大小。

例程:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str);

    printf("The length of the string '%s' is: %zu\n", str, length);

    return 0;
}

在此程序中,我们使用 strlen 函数获取字符串 “Hello, World!” 的长度,并将其打印出来。注意,%zusize_t 类型的 printf 格式说明符。

4. strcmp

  • 头文件#include <string.h>

  • 函数原型int strcmp(const char *str1, const char *str2);

  • 功能: 此函数用于比较两个字符串。比较是基于字符的ASCII值进行的。

  • 参数

    • str1:指向第一个要比较的字符串的指针。

    • str2:指向第二个要比较的字符串的指针。

  • 返回值

    • 如果 str1str2 相等,则返回0。
    • 如果 str1 大于 str2,则返回大于0的数。
    • 如果 str1 小于 str2,则返回小于0的数。

例程

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello, World!";
    char str2[] = "Hello, OpenAI!";
    
    int result = strcmp(str1, str2);
    
    if(result > 0) {
        printf("'%s' is greater than '%s'\n", str1, str2);
    } else if(result < 0) {
        printf("'%s' is less than '%s'\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str2);
    }

    return 0;
}

在此程序中,我们使用 strcmp 函数比较两个字符串 “Hello, World!” 和 “Hello, OpenAI!” 并打印结果。

5. strchr 搜索

  • strchr函数

  • 头文件#include <string.h>

  • 函数原型char *strchr(const char *str, int c);

  • 功能: 此函数在字符串 str 中查找第一次出现字符 c 的位置。

  • 参数

    • str:指向要被搜索的字符串的指针。
    • c:要搜索的字符。
  • 返回值

    • 如果字符 c 在字符串 str 中找到,则返回一个指向该位置的指针。
    • 如果字符 c 在字符串 str 中没有找到,则返回 NULL
  • 例程

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    char c = 'o';
    
    char *result = strchr(str, c);
    
    if(result != NULL) {
        printf("First occurrence of '%c' in '%s' is at position: %ld\n", c, str, result - str);
    } else {
        printf("Character '%c' not found in '%s'\n", c, str);
    }

    return 0;
}

在此程序中,我们使用 strchr 函数在字符串 “Hello, World!” 中查找字符 ‘o’ 的第一次出现的位置,并打印结果。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值