大家好,我是网域小星球。
上一篇我们系统学习了一维数组 ,掌握了批量存储整数数据的方法。而在实际编程中,我们经常需要处理文本信息:姓名、密码、句子、关键词匹配等等,这就需要用到字符数组与字符串。
字符串是 C 语言非常重要的知识点,也是作业、考试、上机实验的必考内容。本篇从原理、语法、库函数到经典案例完整精讲,内容扎实、逻辑清晰,全程适配 VS2022 可直接运行。
目录
[1. 字符数组](#1. 字符数组)
[2. 字符串](#2. 字符串)
[3. strcpy:字符串拷贝](#3. strcpy:字符串拷贝)
[3. 核心区别](#3. 核心区别)
[1. 逐个字符初始化](#1. 逐个字符初始化)
[1. printf 输出](#1. printf 输出)
[2. puts 输出](#2. puts 输出)
[3. scanf 输入](#3. scanf 输入)
[4. gets 输入(读取整行)](#4. gets 输入(读取整行))
[2. strcmp:字符串比较](#2. strcmp:字符串比较)
[3. strcpy:字符串拷贝](#3. strcpy:字符串拷贝)
[4. strcat:字符串拼接](#4. strcat:字符串拼接)
[六、经典案例 1:密码验证](#六、经典案例 1:密码验证)
[七、经典案例 2:统计字母、数字、空格个数](#七、经典案例 2:统计字母、数字、空格个数)
[八、经典案例 3:字符串反转](#八、经典案例 3:字符串反转)
一、本章学习目标
- 理解字符数组与字符串的本质区别
- 掌握字符数组定义、初始化、赋值、遍历
- 理解字符串结束标志
\0的作用 - 熟练使用字符串输入输出:
scanf、gets、puts - 掌握常用字符串库函数:
strlen、strcmp、strcpy、strcat - 完成经典案例:密码验证、统计字符个数、字符串拼接
- 避开新手常见坑:越界、无结束符、输入残留换行符
二、字符数组与字符串基础
1. 字符数组
用于存放多个字符类型数据的数组,类型为 char。
cpp
char arr[5] = {'h', 'e', 'l', 'l', 'o'};
每个元素是一个单独字符,整体不一定是字符串。
2. 字符串
字符串本质是以 \0 作为结束标志的字符数组。
常用于密码判断。
3. strcpy:字符串拷贝
十、本章核心总结
下期预告
C 语言从 0 入门(八)|函数基础:定义、声明、调用与参数传递下一篇我们进入模块化编程核心 ------函数,学习如何把重复代码封装复用,掌握形参、实参、返回值、函数声明等关键知识点,写出结构清晰、可维护的高质量 C 语言程序,全程 VS2022 实战精讲。
-
\0:字符串结束符,ASCII 码为 0 -
系统识别到
\0才认为字符串结束 -
用双引号
"..."定义时,系统自动补\0cpp// 系统自动在末尾加 \0 char str[] = "hello";3. 核心区别
-
字符数组:不一定有
\0 -
字符串:一定以
\0结尾没有\0会导致输出乱码、函数计算错误。三、字符数组的定义与初始化
1. 逐个字符初始化
cppchar arr[6] = {'h', 'e', 'l', 'l', 'o', '\0'};- 字符串常量初始化(最常用)
cppchar str[20] = "hello world";- 省略长度
cppchar str[] = "test";长度自动为 5(包含隐藏的
\0)。四、字符串的输入与输出
1. printf 输出
cppchar str[] = "hello"; printf("%s\n", str);%s专门用于输出字符串,遇到\0停止。2. puts 输出
自动换行,使用更简单:
cppputs(str);3. scanf 输入
以空格或回车为结束标志:
cppchar str[20]; scanf("%s", str);注意:数组名本身表示地址,不需要加 &。
4. gets 输入(读取整行)
可以读取带空格的字符串,直到回车结束:
cppgets(str);五、常用字符串库函数(必须掌握)
使用以下函数需要加头文件:
cpp#include <string.h>- strlen:求字符串长度
cppchar str[] = "hello"; int len = strlen(str); // 结果:5不计
\0,只算有效字符。2. strcmp:字符串比较
cppstrcmp(str1, str2); -
相等:返回 0
-
str1 > str2:返回正数
-
str1 < str2:返回负数 常用于密码判断。
3. strcpy:字符串拷贝
cppstrcpy(dest, src);把 src 内容复制到 dest 中,包括
\0。4. strcat:字符串拼接
cppstrcat(dest, src);把 src 拼接到 dest 末尾。
六、经典案例 1:密码验证
cpp#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> int main() { char pwd[20]; char real_pwd[] = "123456"; printf("请输入密码:"); scanf("%s", pwd); if (strcmp(pwd, real_pwd) == 0) { printf("密码正确,登录成功!\n"); } else { printf("密码错误,请重试!\n"); } return 0; }
七、经典案例 2:统计字母、数字、空格个数
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char str[100];
int letter = 0, num = 0, space = 0, other = 0;
printf("请输入一行字符:");
gets(str);
for (int i = 0; str[i] != '\0'; i++)
{
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
letter++;
else if (str[i] >= '0' && str[i] <= '9')
num++;
else if (str[i] == ' ')
space++;
else
other++;
}
printf("字母:%d\n", letter);
printf("数字:%d\n", num);
printf("空格:%d\n", space);
printf("其他:%d\n", other);
return 0;
}
八、经典案例 3:字符串反转
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
printf("请输入字符串:");
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i < len / 2; i++)
{
char temp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = temp;
}
printf("反转后:%s\n", str);
return 0;
}
九、新手高频易错点
- 字符串必须以
\0结尾,否则输出乱码 scanf遇到空格停止,带空格句子用gets- 数组长度要预留
\0空间,否则越界 - 字符串比较不能用 == ,必须用
strcmp - 字符串复制不能用 = ,必须用
strcpy - VS2022 下使用不安全函数需加宏:
_CRT_SECURE_NO_WARNINGS - 字符串 = 字符数组 + 结束符
\0 - 输入输出:
%s、puts、gets - 核心库函数:
strlen/strcmp/strcpy/strcat - 字符串遍历条件:
str[i] != '\0' - 密码验证、字符统计、反转是最经典题型