16. C语言 字符串详解

打印 上一主题 下一主题

主题 982|帖子 982|积分 2946

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

前言

在 C 语言中,字符串是一种特殊的数据类型,它实际上是以空字符 \0 末端的一维字符数组。本文将从根本概念、常见函数使用、字符数组与字符指针的区别等多个角度深入探究 C 语言字符串操作,资助开辟者更高效地掌握这一焦点内容。

C 字符串的底子概念

字符串的界说



  • 字符串的本质:以空字符 \0 竣事的字符数组。
  • 字符串字面量:比方 "hello world" 是常量,在编译时会自动添加 \0。
###字符串初始化
C 提供了两种主要方式初始化字符串:

  • 字符数组
    1. char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    2. char site[] = "RUNOOB"; // 编译器自动添加 \0
    复制代码
  • 字符指针
    1. char *greeting = "Hello";
    复制代码
   注意:使用字符指针时,字符串内容存储在只读存储区,不能直接修改。
  字符串的内存体现

字符串存储在内存中时,每个字符占据一个字节,末尾以 \0 标志竣事。

常见的字符串操作函数

C 尺度库 <string.h> 提供了一系列用于操作字符串的函数:
函数描述strcpy(s1, s2)将字符串 s2 复制到 s1。strcat(s1, s2)将字符串 s2 毗连到 s1 的末尾。strlen(s1)返回字符串 s1 的长度(不包罗 \0)。strcmp(s1, s2)比较字符串 s1 和 s2,返回值根据巨细关系为 0、正值或负值。strchr(s1, ch)返回指向字符串 s1 中字符 ch 第一次出现位置的指针。strstr(s1, s2)返回指向字符串 s1 中子串 s2 第一次出现位置的指针。
示例代码

以下代码演示了这些函数的根本使用:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char str1[20] = "Hello";
  5.     char str2[] = "World";
  6.     char str3[20];
  7.     int len;
  8.     // 复制字符串
  9.     strcpy(str3, str1);
  10.     printf("strcpy(str3, str1): %s\n", str3);
  11.     // 连接字符串
  12.     strcat(str1, str2);
  13.     printf("strcat(str1, str2): %s\n", str1);
  14.     // 计算字符串长度
  15.     len = strlen(str1);
  16.     printf("strlen(str1): %d\n", len);
  17.     return 0;
  18. }
复制代码
输出效果
  1. strcpy(str3, str1): Hello
  2. strcat(str1, str2): HelloWorld
  3. strlen(str1): 10
复制代码

深入探究字符串长度计算

strlen 与 sizeof 的区别

功能strlensizeof计算内容字符串的实际长度(不包罗 \0)。字符数组的巨细(包罗 \0)。作用范围仅适用于字符串。可用于任何类型的变量和数据结构。计算方式遍历字符串,遇到 \0 时制止计数。在编译时直接得出分配的内存巨细。 示例
  1. #include <stdio.h>
  2. #include <string.h>
  3. void demo() {
  4.     char s[] = "hello, world!";
  5.     printf("sizeof(s): %lu\n", sizeof(s)); // 包括 '\0'
  6.     printf("strlen(s): %lu\n", strlen(s)); // 不包括 '\0'
  7. }
  8. int main() {
  9.     demo();
  10.     return 0;
  11. }
复制代码
输出
  1. sizeof(s): 14
  2. strlen(s): 13
复制代码

字符串操作的注意事项

1. 字符数组的巨细

在明确指定字符数组巨细时,请务必为 \0 预留空间:
  1. char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
复制代码
如果未包含 \0:
  1. char greeting[5] = {'H', 'e', 'l', 'l', 'o'};
  2. printf("%s\n", greeting); // 可能导致未定义行为
复制代码
2. 字符数组和字符指针的区别



  • 字符数组:可修改内容;声明后占用固定内存。
  • 字符指针:内容存储在只读存储区,尝试修改会导致运行错误。
3. 使用安全函数

在 MSVC 编译器中,保举使用安全函数 strcpy_s 和 strcat_s,这些函数多了一个缓冲区巨细参数,可以避免缓冲区溢出问题:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char dest[50];
  5.     strcpy_s(dest, sizeof(dest), "Hello");
  6.     strcat_s(dest, sizeof(dest), ", Secure World!");
  7.     printf("%s\n", dest);
  8.     return 0;
  9. }
复制代码

字符串的遍历与格式化输出

遍历字符串

  1. char str[] = "Hello";
  2. for (int i = 0; str[i] != '\0'; i++) {
  3.     printf("%c ", str[i]);
  4. }
复制代码
格式化输出



  • %s 用于输出字符串:
    1. printf("Greeting: %s\n", str);
    复制代码

总结



  • 字符串的本质是以 \0 竣事的字符数组。
  • 纯熟掌握字符串操作函数,如 strcpy、strcat、strlen。
  • 注意 strlen 与 sizeof 的区别。
  • 使用安全函数(如 strcpy_s)确保代码的安全性。
通过灵活运用 C 语言中的字符串操作,开辟者可以高效地处理文本数据,提高代码的健壮性和安全性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表