目标
-
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 语言中,多维数组的行和列的大小必须是一个已知的常量,不能是变量。如果你需要一个行或列大小可以改变的数组,那么你可能需要使用到动态内存分配(比如使用 malloc
或 calloc
函数)或者使用一维数组的数组(数组的指针)来模拟多维数组。
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个字符和一个结尾的空字符。
字符串的输入和输出
可以使用 printf
和 scanf
函数来进行字符串的输出和输入:
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!” 的长度,并将其打印出来。注意,%zu
是 size_t
类型的 printf 格式说明符。
4. strcmp
-
头文件:
#include <string.h>
-
函数原型:
int strcmp(const char *str1, const char *str2);
-
功能: 此函数用于比较两个字符串。比较是基于字符的ASCII值进行的。
-
参数:
-
str1
:指向第一个要比较的字符串的指针。 -
str2
:指向第二个要比较的字符串的指针。
-
-
返回值:
- 如果
str1
和str2
相等,则返回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’ 的第一次出现的位置,并打印结果。