当前位置: 首页 > news >正文

【C语言】字符与字符串

在 C 语言中,字符(Character) 和 字符串(String) 是两个不同但相关的概念。下面详细介绍它们的定义、存储方式和使用方法:

一、字符(Character)

1. 定义与存储
  • 基本类型char(1 字节,范围 - 128~127 或 0~255,取决于编译器)
  • 存储形式:单个字符用单引号 ' ' 包裹,实际存储为对应的 ASCII 码值
2. 示例代码
#include <stdio.h>int main() {// 直接赋值(字符常量)char c1 = 'A';         // 存储ASCII码值65char c2 = 66;          // 等价于 char c2 = 'B';char newline = '\n';   // 转义字符:换行符// 输出字符和对应的ASCII值printf("c1: %c (ASCII %d)\n", c1, c1);  // 输出: A (ASCII 65)printf("c2: %c (ASCII %d)\n", c2, c2);  // 输出: B (ASCII 66)// 特殊字符(转义序列)char tab = '\t';       // 制表符char quote = '\"';     // 双引号字符return 0;
}
3. 关键注意点
  • 转义字符:使用反斜杠 \ 表示特殊字符,例如:
    '\n'  // 换行符
    '\t'  // 制表符
    '\0'  // 空字符(ASCII 0,字符串终止符)
    '\\'  // 反斜杠本身
    '\''  // 单引号
    '\"'  // 双引号
    
  • 字符与整数的关系char 本质是小整数,可参与算术运算:
    char c = 'A';
    printf("%d\n", c + 1);  // 输出66('A'的ASCII码是65)
    

二、字符串(String)

1. 定义与存储
  • 本质:由多个字符组成的数组,以空字符 '\0' 结尾
  • 两种定义方式
    • 字符数组char str[] = "Hello";
    • 字符指针char *str = "Hello";
2. 字符数组 vs 字符指针
字符数组字符指针
char str[] = "Hello";char *str = "Hello";
数据存储在栈内存数据存储在只读内存区
可修改内容(如 str[0]='J';不可修改内容(修改会导致运行时错误)
数组大小自动计算(含 '\0'指针指向常量字符串的首地址
3. 示例代码
#include <stdio.h>
#include <string.h>  // 字符串处理函数库int main() {// 1. 字符数组方式(可修改)char str1[] = "Hello";  // 等价于 char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};printf("str1长度: %zu\n", strlen(str1));  // 输出5(不包含'\0')printf("str1大小: %zu\n", sizeof(str1));  // 输出6(包含'\0')// 修改字符数组内容str1[0] = 'J';printf("修改后: %s\n", str1);  // 输出 "Jello"// 2. 字符指针方式(指向常量字符串,不可修改)char *str2 = "World";// str2[0] = 'X';  // 错误!修改常量字符串会导致运行时错误// 3. 动态输入字符串(需确保缓冲区足够大)char input[100];printf("请输入字符串: ");scanf("%s", input);  // 注意:scanf遇到空格会截断printf("你输入的是: %s\n", input);// 4. 字符串处理函数示例char src[] = "Copy this";char dest[20];strcpy(dest, src);  // 复制字符串printf("复制结果: %s\n", dest);return 0;
}
误区 1:“指针指向的字符串不能修改,所以指针本身不能修改”
  • 错误:指针变量本身的值(即所指向的地址)可以修改,例如:
    char *str = "Hello";
    str = "World";  // 合法!指针重新指向另一个常量字符串
    

    但 不能通过指针修改其所指向的内存内容
误区 2:“用 char * 定义的字符串都不能修改”
  • 错误:如果 char* 指向的是 可写内存(如动态分配的内存或字符数组),则可以修改。例如:
    char arr[10] = "abc";
    char *ptr = arr;  // ptr指向栈上的数组(可写)
    ptr[0] = 'x';     // 合法,修改数组内容为 "xbc"
4. 字符串处理函数

常用的字符串操作函数(需包含 <string.h>):

函数名功能描述示例
strlen(s)返回字符串长度(不含 '\0'strlen("Hello") → 5
strcpy(dst, src)复制字符串 src 到 dststrcpy(dest, "Hi");
strcat(dst, src)将 src 追加到 dst 末尾strcat(dest, " World");
strcmp(s1, s2)比较 s1 和 s2(按字典序)strcmp("A", "B") → 负数
strchr(s, c)在 s 中查找字符 c 第一次出现的位置strchr("test", 'e') → 指向 e 的指针

三、字符与字符串的区别

特性字符 (char)字符串 (char[] 或 char*)
定义符号单引号 'A'双引号 "Hello"
存储内容单个字符的 ASCII 码值多个字符 + 终止符 '\0'
占用空间1 字节字符串长度 + 1 字节
示例char c = 'A';char s[] = "ABC"; 或 char *s = "ABC";

四、常见错误与注意事项

  1. 未初始化字符串

    未初始化指针直接使用

    char *ptr;
    strcpy(ptr, "test"); // 错误!ptr未指向有效内存
    // 修正:ptr = (char*)malloc(5); strcpy(ptr, "test");
  2. 字符串越界

    char str[3];
    strcpy(str, "ABCD");  // 错误!超出数组大小,导致缓冲区溢出
    
  3. 忘记字符串终止符

    char str[3] = {'A', 'B', 'C'};  // 错误!缺少'\0',不是有效字符串
    printf("%s", str);  // 可能输出乱码,直到遇到内存中的某个'\0'
    
  4. 混淆字符和字符串

    char c = "A";  // 错误!"A"是字符串(含'A'和'\0'),无法赋值给char
    char c = 'A';  // 正确
    

    补充:预分配内存的常用方法

    方法适用场景函数 / 语法示例
    栈内存数组长度固定、编译时已知char arr[size];char name[20];
    堆内存动态分配长度动态变化、运行时确定malloc()/calloc()int *ptr = (int*)malloc(n*sizeof(int));
    常量字符串只读场景,无需修改"Hello"char *str = "World";
    柔性数组结构体末尾的动态数组struct { int len; char data[]; }// C99特性,需动态分配结构体+数组

总结

  • 字符:单个字符用 char 类型表示,存储为 ASCII 码值,用单引号包裹。
  • 字符串:由字符数组组成,以 '\0' 结尾,用双引号定义。
  • 操作字符串:使用标准库函数(如 strlenstrcpy)处理字符串,避免手动操作终止符。
  • 安全性:确保缓冲区足够大,避免越界和未初始化内存的问题。

相关文章:

  • [6-01-01].第12节:字节码文件内容 - 属性表集合
  • Pydantic,Field和Annotated
  • JAVA实战开源项目:周边游平台系统 (Vue+SpringBoot) 附源码
  • Python图像灰度化处理:原理、方法与实战
  • Java八股文——集合「Queue篇」
  • Redis Set集合命令、内部编码及应用场景(详细)
  • 【电赛培训课程】运算放大器及其应用电路设计
  • Abaqus分析步与输出:
  • JVM中的各类引用
  • Redis(02)Win系统如何将Redis配置为开机自启的服务
  • Linux下如何使用shell脚本导出elasticsearch中某一个index的数据为本地csv文件
  • mysql脚本安装
  • 【设计模式-4.11】行为型——解释器模式
  • 【element-ui】el-autocomplete实现 无数据匹配
  • win10系统docker安装dify
  • 【Python新手入门指南】极速搭建Python开发环境
  • open3d:使用彩色图和深度图生成点云
  • js 比较两个对象的值,不相等就push对象的key
  • 虚拟仿真技术赋能家庭教育实训室建设要点解析​
  • Cursor AI编程助手模型选择对了吗?
  • 怎样做企业手机网站/浏览器里面信息是真是假
  • 中建八局第一建设有限公司税号/搜索引擎营销seo
  • o2o电子商务网站策划书/中国制造网外贸平台
  • 网站建设记账做什么科目/seo全称是什么
  • 百度收录万网空间的网站需要多久/百度网站排名优化
  • 福州做网站建设/上海网站建设方案