C PRIMER PLUS——第8节:字符串和字符串函数
目录
1. 字符串的定义与表示
2. 获取字符串的两种方式
3.字符串数组
4. 字符串输入函数
4.1 gets()(不推荐使用,有缓冲区溢出风险)
4.2 fgets()(推荐使用)
4.3 scanf()
4.4 gets_s()(C11 标准,MSVC 支持)
4.5 s_gets()(自定义安全函数)
5. 字符串输出函数
5.1 puts()
5.2 fputs()
5.3 printf()
6.1 strlen()
6.2 strcat()
6.3 strcpy()
6.4 strcmp()
6.5 strlwr() 和 strupr()(非标准,部分编译器支持)
7.1 字符分类函数
7.2 字符转换函数
7.3综合示例:统计字符串中的字母和数字
1. 字符串的定义与表示
在 C 语言中,字符串是由字符数组表示的,以 ** 空字符\0
** 结尾。例如:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式初始化
char message[] = "Hello"; // 自动添加'\0',等价于上面的写法
2. 获取字符串的两种方式
- 字符数组:预分配内存,长度固定
char name[20]; // 定义长度为20的字符数组
- 字符指针:指向字符串常量(存储在只读内存区)
- 只读常量区特点:①内容不可以修改。②里面定义的字符串是可以复用的。
char *greeting = "Hello"; // 指向字符串常量的指针
3.字符串数组
- 二维字符数组:存储多个字符串
char fruits[3][10] = {"Apple","Banana","Cherry"
}; // 3个字符串,每个最大长度9(留一个位置给'\0')
- 指针数组:每个元素是一个字符串指针
char *colors[] = {"Red","Green","Blue"
}; // 更灵活,可指向不同长度的字符串
4. 字符串输入函数
4.1 gets()
(不推荐使用,有缓冲区溢出风险)
- 作用:从标准输入读取一行字符串(直到换行符
\n
) - 缺点:不检查输入长度,可能导致缓冲区溢出
- 示例
char str[10];
gets(str); // 输入超过9个字符会溢出
4.2 fgets()
(推荐使用)
- 作用:从文件或标准输入读取字符串,指定最大长度
- 原型:
fgets(str, size, stdin)
- 特点:会读取换行符
\n
,需手动处理 - 示例:
char str[10];
fgets(str, 10, stdin); // 最多读9个字符,留一个给'\0'
4.3 scanf()
- 作用:格式化输入,遇空格或换行符停止
- 示例:
char name[20];
scanf("%s", name); // 输入"John Doe"时,只读取"John"
4.4 gets_s()
(C11 标准,MSVC 支持)
- 作用:安全版本的
gets()
,需指定缓冲区大小 - 示例:
char str[10];
gets_s(str, 10); // 安全读取,超出长度会截断
4.5 s_gets()
(自定义安全函数)
- 作用:手动实现安全读取,处理换行符
char *s_gets(char *st, int n) {char *ret_val;ret_val = fgets(st, n, stdin);if (ret_val) {char *find = strchr(st, '\n'); // 查找换行符if (find) *find = '\0'; // 替换为'\0'else while (getchar() != '\n') continue; // 清除多余输入}return ret_val;
}
5. 字符串输出函数
5.1 puts()
- 作用:输出字符串并自动添加换行符
- 示例:
char str[] = "Hello";
puts(str); // 输出"Hello"后换行
5.2 fputs()
- 作用:输出字符串到文件或标准输出,不添加换行符
- 示例:
char str[] = "Hello";
fputs(str, stdout); // 输出"Hello"
5.3 printf()
- 作用:格式化输出字符串
- 示例:
char name[] = "Alice";
printf("Hello, %s!\n", name); // 输出"Hello, Alice!"
6. <string.h>
函数
6.1 strlen()
- 作用:计算字符串长度(不包含
\0
) - 示例:
char str[] = "Hello";
int len = strlen(str); // len = 5
6.2 strcat()
- 作用:拼接两个字符串
- 原型:
strcat(dest, src)
- 示例:
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src); // dest = "Hello, World!"
6.3 strcpy()
- 作用:复制字符串
- 原型:
strcpy(dest, src)
- 示例:
char src[] = "Hello";
char dest[10];
strcpy(dest, src); // dest = "Hello"
6.4 strcmp()
- 作用:比较两个字符串
- 返回值:
- 0:相等
- 负数:
str1 < str2
- 正数:
str1 > str2
- 示例:
int result = strcmp("apple", "banana"); // result < 0
6.5 strlwr()
和 strupr()
(非标准,部分编译器支持)
- 作用:转换字符串大小写
- 示例:
char str1[] = "Hello";
char str2[] = "Hello";
_strlwr(str1); // str1 = "hello" (如果编译器支持)
_strupr(str2); // str2 = "HELLO" (如果编译器支持)
7. <ctype.h>
字符处理函数
7.1 字符分类函数
7.2 字符转换函数
7.3综合示例:统计字符串中的字母和数字
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {char str[100];int letters = 0, digits = 0, others = 0;printf("Enter a string: ");fgets(str, 100, stdin);// 处理fgets可能读取的换行符str[strcspn(str, "\n")] = 0;for (int i = 0; str[i] != '\0'; i++) {if (isalpha(str[i]))letters++;else if (isdigit(str[i]))digits++;elseothers++;}printf("Letters: %d\n", letters);//识别字母数量printf("Digits: %d\n", digits);//识别数字数量printf("Other characters: %d\n", others);//识别空格或符号数量return 0;
}