CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
C 语言入门/课时/数组与字符串
RawBlame
课时目录12 节

C 语言入门

  1. 01C 是什么
  2. 02类型与变量
  3. 03控制流与运算符
  4. 04函数
  5. 05指针与内存
  6. 06数组与字符串
  7. 07结构体与联合体
  8. 08预处理器
  9. 09编译与构建
  10. 10并发与进程
  11. 11调试与测试
  12. 12综合练习

数组与字符串

字符数组、动态数组、缓冲区。

35 分钟

数组与字符串

C 没有独立字符串类型,字符数组与指针紧密相关。对照 /roadmaps/c,本课覆盖数组、C 字符串、string.h 及缓冲区安全。

学习目标

  • 声明与遍历一维数组
  • 理解数组名与指针的关系
  • 使用 C 字符串与 string.h
  • 警惕缓冲区溢出

核心概念

数组与字符串

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LINE 64

static void reverse(char *s) {
    size_t i = 0, j = strlen(s);
    if (j == 0) return;
    j--;
    while (i < j) {
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
        i++;
        j--;
    }
}

int main(void) {
    int nums[] = {10, 20, 30, 40, 50};
    int n = (int)(sizeof nums / sizeof nums[0]);

    for (int i = 0; i < n; i++) {
        printf("nums[%d]=%d ", i, nums[i]);
    }
    printf("\n");

    /* 字符数组:可修改 */
    char greeting[MAX_LINE] = "Hello";
    strncat(greeting, ", C!", MAX_LINE - strlen(greeting) - 1);
    printf("%s (len=%zu)\n", greeting, strlen(greeting));

    /* 字符串字面量:只读 */
    const char *title = "CodeRoadMap";
    printf("%s\n", title);

    reverse(greeting);
    printf("reversed: %s\n", greeting);

    /* 动态「字符串」 */
    char *buf = malloc(32);
    if (buf) {
        snprintf(buf, 32, "track=%s", title);
        puts(buf);
        free(buf);
    }

    /* 二维数组:3 行 4 列 */
    int matrix[3][4] = {0};
    matrix[1][2] = 99;
    printf("matrix[1][2]=%d\n", matrix[1][2]);

    return 0;
}

要点

主题说明
数组大小sizeof arr / sizeof arr[0]
字符串结尾'\0' 终止符
安全函数优先 strncpy、snprintf,避免裸 strcpy
数组 decay数组名在多数表达式中转为指向首元素的指针

strlen 不计 '\0';分配时需 len + 1 字节。

与 C++/Java 对照

特性CC++Java
字符串char[] / char *std::stringString
数组长度编译期 / 手动跟踪std::array、vector
.length
边界检查无(越界 UB)vector 有 at()有
拼接strcat / 手动+ 运算符+
可变字符串字符数组std::stringStringBuilder

Java String 不可变且自带长度;C 程序员必须自己保证缓冲区足够大。

练习

  • 写函数统计字符串中元音字母个数
  • 用 snprintf 格式化 "user=123, score=98.5" 到固定缓冲区
  • 实现 int index_of(const char *s, char c) 返回首次出现下标
  • 说明 char *s = "hi" 与 char s[] = "hi" 的可修改性差异

小结

数组与字符串在 C 中一体;长度与 '\0' 由程序员负责。 下一课学习结构体与联合体。

加载本节练习…
← 上一课指针与内存下一课 →结构体与联合体