C 语言中的字符串处理及常用函数
发布时间: 2024-03-06 03:52:08 阅读量: 30 订阅数: 25
C语言中字符串处理
# 1. C 语言中的字符串数据类型介绍
C 语言中的字符串是一种常见的数据类型,通常用于存储文本信息。接下来我们将介绍 C 语言中的字符串数据类型的定义、存储方式以及其特性和常见操作。
## 1.1 字符串数据类型的定义
在 C 语言中,字符串实际上是以字符数组的形式存在的。字符串以 null 结尾,即以 '\0' (ASCII 值为 0) 结束。例如,字符串 "hello" 在内存中实际上表示为 ['h', 'e', 'l', 'l', 'o', '\0']。
## 1.2 字符串的存储方式
字符串在内存中以字符数组的形式存储。可以使用字符数组来表示字符串,也可以使用指向字符的指针来表示字符串。
```c
char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 字符数组表示的字符串
char *str2 = "Hello"; // 指针表示的字符串
```
## 1.3 字符串的特性和操作
- 字符串是不可变的,即一旦定义,其内容就不能被修改。
- C 语言提供了一些字符串处理函数,如 strlen()、strcpy()、strcat()、strcmp() 等,用于操作字符串。
接下来的章节将详细介绍字符串的输入输出、处理函数、搜索和分割、转换函数以及其他常用字符串处理函数。
# 2. C 语言中的字符串输入和输出
在 C 语言中,处理字符串的输入和输出是非常常见的操作。本章将介绍如何从键盘输入字符串,以及如何向屏幕输出字符串,同时还会介绍一些常用的字符串格式化输入输出函数。
### 2.1 从键盘输入字符串
在 C 语言中,使用 `scanf` 函数可以从键盘输入字符串,但值得注意的是,`scanf` 函数在输入字符串时会遇到空格、制表符和换行符等空白字符时就会停止输入,否则会一直读入。使用 `fgets` 函数可以更加灵活地输入字符串,因为它可以读入含有空格的字符串,并且可以限定最大输入字符数,避免缓冲区溢出。
```c
#include <stdio.h>
int main() {
char str1[100];
char str2[100];
// 使用 scanf 输入字符串
printf("请输入字符串(使用 scanf): ");
scanf("%s", str1);
printf("使用 scanf 输入的字符串: %s\n", str1);
// 使用 fgets 输入字符串
printf("请输入字符串(使用 fgets): ");
fgets(str2, 100, stdin);
printf("使用 fgets 输入的字符串: %s\n", str2);
return 0;
}
```
**代码说明:**
- 使用 `scanf` 输入字符串时,如果字符串中含有空格,则空格后面的内容会被忽略。
- 使用 `fgets` 输入字符串时,第二个参数表示输入的最大字符数,`stdin` 表示从标准输入读入。
**代码运行结果示例:**
```
请输入字符串(使用 scanf): hello world
使用 scanf 输入的字符串: hello
请输入字符串(使用 fgets): hello world
使用 fgets 输入的字符串: hello world
```
### 2.2 向屏幕输出字符串
在 C 语言中,使用 `printf` 函数可以向屏幕输出字符串。在输出字符串时,可以使用格式化字符串控制输出的格式。
```c
#include <stdio.h>
int main() {
char name[] = "Alice";
int age = 25;
// 向屏幕输出字符串
printf("姓名:%s,年龄:%d\n", name, age);
return 0;
}
```
**代码说明:**
- 使用 `%s` 表示输出字符串,`%d` 表示输出整数。
**代码运行结果示例:**
```
姓名:Alice,年龄:25
```
### 2.3 字符串格式化输入输出函数
除了简单的输入输出外,C 语言还提供了一系列的字符串格式化输入输出函数,例如 `sprintf` 和 `sscanf` 函数,这些函数可以更加灵活地进行字符串的输入输出操作。
# 3. C 语言中的字符串处理函数
在 C 语言中,字符串处理函数是非常常用的,可以帮助我们对字符串进行各种操作和处理。接下来,我们将介绍几个常见的字符串处理函数及其用法。
### 3.1 strlen() 函数
`strlen()` 函数用于获取字符串的长度,即字符串中字符的个数,不包括字符串结束符 `\0`。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
int len = strlen(str);
printf("The length of the string is: %d\n", len);
return 0;
}
```
**代码场景说明:** 定义了一个字符串 `str`,使用 `strlen()` 函数获取字符串长度,并输出结果。
**代码总结:** `strlen()` 函数返回字符串的实际长度,不包括末尾的空字符。
**结果说明:** 执行程序后,将输出字符串的长度为 13。
### 3.2 strcpy() 和 strncpy() 函数
`strcpy()` 和 `strncpy()` 函数用于复制字符串,其中 `strcpy()` 复制整个字符串,而 `strncpy()` 则可以指定复制的长度。
```c
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello";
char dest[20];
// 使用 strcpy() 函数复制整个字符串
strcpy(dest, source);
printf("copied string using strcpy(): %s\n", dest);
char source2[] = "World";
char dest2[20];
// 使用 strncpy() 函数指定复制的长度
strncpy(dest2, source2, 3);
dest2[3] = '\0'; // 手动添加字符串结束符
printf("copied string using strncpy(): %s\n", dest2);
return 0;
}
```
**代码场景说明:** 分别使用 `strcpy()` 和 `strncpy()` 函数复制字符串,并输出结果。
**代码总结:** `strcpy()`、`strncpy()` 函数用于字符串复制,前者复制整个字符串,后者可以指定复制长度。
**结果说明:** 执行程序后将输出两个复制后的字符串: "Hello" 和 "Wor"。
### 3.3 strcat() 和 strncat() 函数
`strcat()` 和 `strncat()` 函数用于将一个字符串追加到另一个字符串的末尾。
```c
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char source[] = "World";
// 使用 strcat() 函数追加整个字符串
strcat(dest, source);
printf("appended string using strcat(): %s\n", dest);
char dest2[20] = "Hello, ";
char source2[] = "Universe";
// 使用 strncat() 函数指定追加的长度
strncat(dest2, source2, 3);
printf("appended string using strncat(): %s\n", dest2);
return 0;
}
```
**代码场景说明:** 使用 `strcat()` 和 `strncat()` 函数将一个字符串追加到另一个字符串的末尾,并输出结果。
**代码总结:** `strcat()`、`strncat()` 函数用于字符串追加,前者追加整个字符串,后者可以指定追加长度。
**结果说明:** 执行程序后将输出两个追加后的字符串: "Hello, World" 和 "Hello, Uni"。
# 4. C 语言中的字符串搜索和分割
在 C 语言中,有一些字符串处理函数可以用来搜索字符串中的特定字符或子字符串,以及对字符串进行分割操作。
#### 4.1 strchr() 和 strrchr() 函数
- `strchr()` 函数用于在字符串中查找指定字符的第一个匹配位置,如果找到则返回该位置的指针,否则返回 NULL。
- `strrchr()` 函数与 `strchr()` 类似,但它是从字符串的末尾开始向前查找指定字符的最后一个匹配位置。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
char *ptr1 = strchr(str, 'o');
char *ptr2 = strrchr(str, 'o');
if (ptr1 != NULL) {
printf("First 'o' found at position: %ld\n", ptr1 - str);
}
if (ptr2 != NULL) {
printf("Last 'o' found at position: %ld\n", ptr2 - str);
}
return 0;
}
```
**代码说明:**
- 使用 `strchr()` 函数找到字符串中第一个出现的字符 'o',并计算其位置。
- 使用 `strrchr()` 函数找到字符串中最后一个出现的字符 'o',并计算其位置。
- 代码输出了第一个和最后一个字符 'o' 的位置。
**代码运行结果:**
```
First 'o' found at position: 4
Last 'o' found at position: 8
```
#### 4.2 strstr() 函数
- `strstr()` 函数用于在一个字符串中查找第一次出现另一个字符串的位置,如果找到则返回该位置的指针,否则返回 NULL。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
char *ptr = strstr(str, "world");
if (ptr != NULL) {
printf("Substring 'world' found at position: %ld\n", ptr - str);
}
return 0;
}
```
**代码说明:**
- 使用 `strstr()` 函数在字符串中查找子字符串 "world" 的位置。
- 如果找到,则输出其位置。
**代码运行结果:**
```
Substring 'world' found at position: 7
```
#### 4.3 strtok() 函数
- `strtok()` 函数用于将字符串分割成一个个子字符串,根据指定的分隔符来进行分割。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,orange,banana,grape";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}
```
**代码说明:**
- 使用 `strtok()` 函数按逗号分割字符串,并循环输出每个子字符串。
**代码运行结果:**
```
apple
orange
banana
grape
```
# 5. C 语言中的字符串转换函数
在 C 语言中,字符串转换函数是非常常用的,可以实现将字符串与其他数据类型之间的转换。下面将分别介绍几个常用的字符串转换函数及其用法。
### 5.1 atoi() 和 atof() 函数
- `atoi()`: 字符串转换为整数。以下是一个示例代码,将一个字符串转换为整数:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "12345";
int num = atoi(str);
printf("转换后的整数为: %d\n", num);
return 0;
}
```
- `atof()`: 字符串转换为浮点数。以下是一个示例代码,将一个字符串转换为浮点数:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "3.14";
double num = atof(str);
printf("转换后的浮点数为: %f\n", num);
return 0;
}
```
### 5.2 itoa() 函数
`itoa()`: 整数转换为字符串。由于标准 C 库中并没有提供 `itoa()` 函数,可以使用 `sprintf()` 函数来实现将整数转换为字符串的功能。以下是一个示例代码:
```c
#include <stdio.h>
int main() {
int num = 12345;
char str[20];
sprintf(str, "%d", num);
printf("转换后的字符串为: %s\n", str);
return 0;
}
```
### 5.3 sprintf() 和 sscanf() 函数
- `sprintf()`: 格式化输出到字符串。以下是一个示例代码,使用 `sprintf()` 将多个变量格式化输出到一个字符串中:
```c
#include <stdio.h>
int main() {
int num1 = 10, num2 = 20;
char str[20];
sprintf(str, "数字1是:%d, 数字2是:%d", num1, num2);
printf("%s\n", str);
return 0;
}
```
- `sscanf()`: 从字符串中格式化输入。以下是一个示例代码,使用 `sscanf()` 从字符串中读取数据:
```c
#include <stdio.h>
int main() {
char str[] = "25 36";
int num1, num2;
sscanf(str, "%d %d", &num1, &num2);
printf("从字符串中读取的数字为:%d 和 %d\n", num1, num2);
return 0;
}
```
这些是 C 语言中常用的字符串转换函数,能够方便地实现字符串与其他数据类型的转换。
# 6. C 语言中的其他常用字符串处理函数
在 C 语言中,除了常见的字符串处理函数外,还有一些其他常用的字符串处理函数,它们在不同场景下都有重要的作用。
**6.1 memset() 函数**
`memset()` 函数用于将指定内存区域的前 n 个字节设置为特定的值。这在某些情况下可以方便地初始化内存块,比如初始化字符数组为全零。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[50];
memset(str, 'A', sizeof(str)); // 将 str 数组设为 'A'
printf("Initialized string: %s\n", str);
return 0;
}
```
**代码说明**:
- 通过 `memset()` 函数将 `str` 数组的每个元素都设置为字符 'A'。
- `sizeof(str)` 返回 `str` 数组的大小,这里是 50 个字节。
- 最终输出初始化后的字符串 `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`。
**6.2 memcpy() 函数**
`memcpy()` 函数用于在内存之间拷贝一定长度的数据。比如在处理字符串时,我们经常会用到这个函数来实现字符串的复制。
```c
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[50];
memcpy(dest, src, strlen(src) + 1); // 复制 src 到 dest
printf("Copied string: %s\n", dest);
return 0;
}
```
**代码说明**:
- 使用 `memcpy()` 函数将 `src` 的内容复制到 `dest` 中。
- 这里要注意第三个参数是需要拷贝的字节数,通常取源字符串的长度加 1(包括字符串末尾的空字符 `\0`)。
- 最终输出复制后的字符串 `Hello, World!`。
**6.3 memmove() 函数**
`memmove()` 函数与 `memcpy()` 类似,不同之处在于 `memmove()` 处理重叠内存区域时更安全。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
memmove(str + 7, str, 7); // 将字符串前面的部分移到后面
printf("Modified string: %s\n", str);
return 0;
}
```
**代码说明**:
- 使用 `memmove()` 函数将 `str` 字符串开头的 7 个字符移到后面。
- 这里由于源地址和目标地址有重叠,因此使用 `memmove()` 来确保拷贝的正确性。
- 最终输出移动后的字符串 `World!Hello,`。
**6.4 memcmp() 函数**
`memcmp()` 函数用于比较两个内存区域的前 n 个字节内容是否相等。在某些情况下,可以用来判断字符串是否相同。
```c
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "Hello";
if (memcmp(str1, str2, strlen(str1)) == 0) {
printf("The strings are equal.\n");
} else {
printf("The strings are not equal.\n");
}
return 0;
}
```
**代码说明**:
- 使用 `memcmp()` 函数比较两个字符串是否相等。
- 这里比较的长度取两个字符串中较短的一个的长度。
- 如果相等,则输出 `The strings are equal.`。
以上就是 C 语言中的一些其他常用字符串处理函数,它们在实陃场景中都有重要的作用。
0
0