C语言教程(十六): C 语言字符串详解

一、字符串的表示

在C语言中,字符串是由一系列字符组成,并且以空字符 `'\0'` 作为结束标志。字符串通常用字符数组来表示。例如:

char str\[\] = {'H', 'e', 'l', 'l', 'o', '\0'}; 也可以使用字符串字面量来初始化字符数组:char str\[\] = "Hello"; 编译器会自动在字符串字面量的末尾添加 `'\0'`

二、字符串的初始化

2.1 字符数组初始化

可以在定义字符数组时进行初始化,如上面的例子所示。还可以指定数组的大小:char str10 = "Hello"; 若指定的数组大小小于字符串字面量的长度(包含 `'\0'`),会导致编译错误。

2.2 指针初始化

除了使用字符数组,还可以用指针指向字符串字面量:const char *str = "Hello"; 这里的 `str` 是一个指向字符串常量的指针。要注意,字符串常量存储在只读内存区域,不能修改其内容。

三、字符串操作函数

C语言标准库提供了许多用于操作字符串的函数,这些函数定义在 `<string.h>` 头文件中。

3.1 `strlen` 函数

`strlen` 函数用于计算字符串的长度,不包含结束符 `'\0'`。示例如下:

复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    size_t len = strlen(str);
    printf("字符串长度: %zu\n", len);
    return 0;
}

3.2 `strcpy` 函数

**`strcpy`**函数用于将一个字符串复制到另一个字符数组中。示例如下:

复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);
    printf("复制后的字符串: %s\n", dest);
    return 0;
}

要注意,目标数组的大小必须足够大,以容纳源字符串(包含 `'\0'`),否则会导致缓冲区溢出。

3.3 `strcat` 函数

`strcat` 函数用于将一个字符串追加到另一个字符串的末尾。示例如下:

复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello";
    char str2[] = " World";
    strcat(str1, str2);
    printf("拼接后的字符串: %s\n", str1);
    return 0;
}

3.4 `strcmp` 函数

`strcmp` 函数用于比较两个字符串。如果两个字符串相等,返回 0;如果第一个字符串小于第二个字符串,返回一个负数;如果第一个字符串大于第二个字符串,返回一个正数。示例如下

复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "Hello";
    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("两个字符串相等\n");
    } else {
        printf("两个字符串不相等\n");
    }
    return 0;
}

四、字符串的输入输出

4.1 输出

使用 `printf ` 函数输出字符串,格式控制符为 `%s`。示例如下:

复制代码
#include <stdio.h>

int main() {
    char str[] = "Hello";
    printf("%s\n", str);
    return 0;
}

4.2 输入

`scanf` 函数: 使用 `scanf ` 函数输入字符串,格式控制符为 `%s `。但 `scanf` 遇到空格会停止读取。示例如下:

复制代码
#include <stdio.h>

int main() {
    char str[100];
    scanf("%s", str);
    printf("你输入的字符串是: %s\n", str);
    return 0;
}

`fgets` 函数: `fgets` 函数可以读取包含空格的字符串,它会读取一行输入,直到遇到换行符或达到指定的最大长度。示例如下:

复制代码
#include <stdio.h>

int main() {
    char str[100];
    fgets(str, sizeof(str), stdin);
    printf("你输入的字符串是: %s\n", str);
    return 0;
}

五、注意事项

5.1 缓冲区溢出

在使用 `strcpy `、`strcat` 等函数时,要确保目标数组有足够的空间来存储字符串,否则会导致缓冲区溢出,可能引发安全问题。

5.2 字符串常量

使用指针指向字符串常量时,不能修改字符串的内容,因为字符串常量存储在只读内存区域。如果需要修改字符串,应该使用字符数组。

5.3 字符串结束符

处理字符串时,要确保字符串以 `'\0'` 结尾,否则在使用字符串操作函数时可能会出现未定义行为。

相关推荐
张小姐的猫2 分钟前
【AI大模型接入SDK】 —— SQLite上手
linux·开发语言·c++·人工智能·python·log4j
溪语流沙18 分钟前
【Python项目实战】部署上线:把博客发布到云服务器
服务器·开发语言·python
岁岁种桃花儿26 分钟前
Vue组件第六篇:Vue单文件组件
开发语言·前端·javascript·vue.js
朽棘不雕33 分钟前
Qt项目代码解释
开发语言·qt
计算机毕设定制辅导-无忧学长42 分钟前
《基于Java的旧物回收管理系统设计与实现》
java·开发语言
“AI国潮设计-小江”42 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁美食猫IP & 创意甜品设计(附ComfyUI工作流与商用授权思路)
开发语言·人工智能·python·prompt·aigc
sdm0704271 小时前
仿muduo库实现高并发服务器-下
开发语言·网络·c++·多路转接
爱奥尼欧1 小时前
【Git】远程分支删了本地还在、两个分支历史不相干?两招故障排解
开发语言·git
Java后端的Ai之路1 小时前
Git冲突完整排查与实战:本地修改覆盖报错到成功推送全流程复盘
开发语言·人工智能·git·python·pop
skywalk81631 小时前
AI 中台记录:使用码道基于deepseek harness制作AI数字中台9.14日
开发语言·人工智能·ai中台