C 语言从 0 入门(七)|字符数组与字符串完整精讲|VS2022 高质量实战

大家好,我是网域小星球。

上一篇我们系统学习了一维数组 ,掌握了批量存储整数数据的方法。而在实际编程中,我们经常需要处理文本信息:姓名、密码、句子、关键词匹配等等,这就需要用到字符数组与字符串

字符串是 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 的作用
  • 熟练使用字符串输入输出:scanfgetsputs
  • 掌握常用字符串库函数:strlenstrcmpstrcpystrcat
  • 完成经典案例:密码验证、统计字符个数、字符串拼接
  • 避开新手常见坑:越界、无结束符、输入残留换行符

二、字符数组与字符串基础

1. 字符数组

用于存放多个字符类型数据的数组,类型为 char

cpp 复制代码
char arr[5] = {'h', 'e', 'l', 'l', 'o'};

每个元素是一个单独字符,整体不一定是字符串

2. 字符串

字符串本质是\0 作为结束标志的字符数组

常用于密码判断

3. strcpy:字符串拷贝

十、本章核心总结


下期预告

C 语言从 0 入门(八)|函数基础:定义、声明、调用与参数传递下一篇我们进入模块化编程核心 ------函数,学习如何把重复代码封装复用,掌握形参、实参、返回值、函数声明等关键知识点,写出结构清晰、可维护的高质量 C 语言程序,全程 VS2022 实战精讲。

  • \0:字符串结束符,ASCII 码为 0

  • 系统识别到 \0 才认为字符串结束

  • 用双引号 "..." 定义时,系统自动补 \0

    cpp 复制代码
    // 系统自动在末尾加 \0
    char str[] = "hello";

    3. 核心区别

  • 字符数组:不一定有 \0

  • 字符串:一定以 \0 结尾没有 \0 会导致输出乱码、函数计算错误。

    三、字符数组的定义与初始化

    1. 逐个字符初始化

    cpp 复制代码
    char arr[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
    1. 字符串常量初始化(最常用)
    cpp 复制代码
    char str[20] = "hello world";
    1. 省略长度
    cpp 复制代码
    char str[] = "test";

    长度自动为 5(包含隐藏的 \0)。

    四、字符串的输入与输出

    1. printf 输出

    cpp 复制代码
    char str[] = "hello";
    printf("%s\n", str);

    %s 专门用于输出字符串,遇到 \0 停止。

    2. puts 输出

    自动换行,使用更简单:

    cpp 复制代码
    puts(str);

    3. scanf 输入

    空格或回车为结束标志:

    cpp 复制代码
    char str[20];
    scanf("%s", str);

    注意:数组名本身表示地址,不需要加 &

    4. gets 输入(读取整行)

    可以读取带空格的字符串,直到回车结束:

    cpp 复制代码
    gets(str);

    五、常用字符串库函数(必须掌握)

    使用以下函数需要加头文件:

    cpp 复制代码
    #include <string.h>
    1. strlen:求字符串长度
    cpp 复制代码
    char str[] = "hello";
    int len = strlen(str); // 结果:5

    不计 \0,只算有效字符

    2. strcmp:字符串比较

    cpp 复制代码
    strcmp(str1, str2);
  • 相等:返回 0

  • str1 > str2:返回正数

  • str1 < str2:返回负数 常用于密码判断

    3. strcpy:字符串拷贝

    cpp 复制代码
    strcpy(dest, src);

    把 src 内容复制到 dest 中,包括 \0

    4. strcat:字符串拼接

    cpp 复制代码
    strcat(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
  • 输入输出:%sputsgets
  • 核心库函数:strlen/strcmp/strcpy/strcat
  • 字符串遍历条件:str[i] != '\0'
  • 密码验证、字符统计、反转是最经典题型
相关推荐
Jia ming2 小时前
C语言实现日期天数计算
c语言·开发语言·算法
xh didida2 小时前
C++ -- string
开发语言·c++·stl·sring
lly2024062 小时前
Bootstrap 折叠组件详解
开发语言
无限进步_2 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
模板template
开发语言·c++
大邳草民3 小时前
Python 中 global 与 nonlocal 的语义与机制
开发语言·笔记·python
charlie1145141913 小时前
通用GUI编程技术——图形渲染实战(二十九)——Direct2D架构与资源体系:GPU加速2D渲染入门
开发语言·c++·学习·架构·图形渲染·win32
历程里程碑3 小时前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
无限进步_3 小时前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio