C语言中字符与字符串的区别?

在 C 语言中,字符(Character)和字符串(String)是两个不同的概念,它们在定义、存储、操作等方面都存在明显的区别,下面为你详细介绍:

定义与表示

字符

(1)字符是单个的字符数据,在 C 语言中用单引号 ’ ’ 来表示。字符类型使用 char 关键字来声明。
例如:

#include <stdio.h>int main() 
{char ch = 'A';	//ch为字符变量,它它存储了字符 'A'printf("字符: %c\n", ch);return 0;
}

(2)占用1字节内存。用于存储一个字符的 ASCII 码值。
例如,字符 ‘A’ 的 ASCII 码值是 65,在内存中就存储这个整数值。

字符串

(1)字符串是由零个或多个字符组成的序列,以空字符’\0’(ASCII值为0)结尾。
(2)用双引号" " 包裹,例如:char str[] = “Hello”;
(3)存储时需额外1字节存放’\0’。例如,"Hello"占用6字节(5字符 + 1终止符)。
实际上字符串在 C 语言中是以字符数组的形式存储的
例如:

#include <stdio.h>int main() 
{char str[] = "Hello";printf("字符串: %s\n", str);return 0;
}
/*str 是一个字符数组,它存储了字符串 "Hello",该字符串在内存中实际存储为 'H'、'e'、'l'、'l'、'o'、'\0'。*/

存储方式

字符:

字符只占用一个字节的内存空间,用于存储一个字符的 ASCII 码值。
例如,字符 ‘A’ 的 ASCII 码值是 65,在内存中就存储这个整数值。

字符串:

(1)字符串存储在字符数组中,数组的每个元素存储一个字符,并且最后一个元素必须是 ‘\0’。因此,字符串所占用的内存空间等于字符串中字符的个数加 1。
(2)未正确添加’\0’的字符数组无法被当作字符串处理(可能导致越界访问)。
例如,字符串 “Hello” 有 5 个字符,加上结束符 ‘\0’,总共占用 6 个字节的内存空间。

赋值与初始化

字符:

字符变量可以直接用单引号括起来的字符进行赋值。

例如:

char ch;
ch = 'B';

操作函数:getchar(), putchar()等。

#include <stdio.h>int main() 
{char ch;printf("请输入一个字符: ");ch = getchar();printf("你输入的字符是: %c\n", ch);return 0;
}

字符串:

字符串的赋值和初始化有多种方式。可以在定义数组时直接用双引号初始化,也可以使用 strcpy 等函数进行赋值。
例如:

#include <stdio.h>
#include <string.h>
int main() 
{char str1[] = "World";	// 自动添加'\0',长度6char str2[10];    	char str4[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 手动添加char *str5 = "Hello";       // 字符串常量(不可修改)strcpy(str2, str1);printf("str2: %s\n", str2);return 0;
}

操作函数:strlen(), strcpy(), strcmp()等,依赖’\0’判断结尾。

#include <stdio.h>
#include <string.h>int main() 
{char str[] = "Hello";int len = strlen(str);printf("字符串的长度是: %d\n", len);return 0;
}

输入输出操作

字符:

输入字符可以使用 scanf 函数(格式控制符为 %c)或 getchar 函数;输出字符可以使用 printf 函数(格式控制符为 %c)或 putchar 函数。

字符串:

输入字符串可以使用 scanf 函数(格式控制符为 %s)、gets 函数(不推荐,存在缓冲区溢出风险)或 fgets 函数;输出字符串可以使用 printf 函数(格式控制符为 %s)或 puts 函数。
例如:

#include <stdio.h>int main() 
{char str[20];printf("请输入一个字符串: ");fgets(str, sizeof(str), stdin);printf("你输入的字符串是: %s", str);return 0;
}

内存与指针

字符

存储在栈或寄存器中,直接通过变量名访问。

字符串

(1)若通过数组定义(如char str[]),内存分配在栈上,内容可修改。
(2)若通过指针定义(如char *str = “…”),指向常量区的只读内存,修改会导致未定义行为(如程序崩溃)。
(3)sizeof运算符对数组返回总字节数(含’\0’),对指针返回指针大小(通常4或8字节)。

示例对比

// 字符
char ch = 'A';          // 正确
char ch2 = 'AB';        // 错误:单引号内只能有一个字符// 字符串
char s1[] = "Hello";    // 正确,自动添加'\0'
char s2[5] = "Hello";   // 错误:长度不足(需至少6字节)
char s3[] = {'H', 'i'}; // 不是字符串(缺少'\0')

总结

特性字符(char)字符串(char[]/char)*
表示单引号(‘A’)双引号(“Hello”)
内存占用1字节字符数 + 1(‘\0’)
结尾标志必须包含’\0’
操作函数getchar(), putchar()strlen(), strcpy()等
可修改性可修改数组可修改,指针常量不可修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mapbox进阶,添加绘图扩展插件,裁剪线

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…

react redux用法学习

参考资料&#xff1a; https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具&#xff1a;deepseek&#xff0c;通义灵码 第一天 安装相关依赖&#xff1a; 使用redux的中间件&#xff1a; npm i react-redu…

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展&#xff0c;越来越多的企业意识到在数字营销中&#xff0c;网站的曝光度和排名至关重要。无论是想要提高品牌知名度&#xff0c;还是想要通过在线销售增加收益&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是一项不可忽视的关键策略。而要…

SpringBoot速成(九)获取用户信息 P9-P10

1.代码展示 P9 07&#xff1a;09&#xff1a;如何让Authorization直接保存 UserController: //获取用户信息GetMapping("/userInfo")public Result<User> userInfo(RequestHeader(name"Authorization") String token){//根据token得到usernameMap…

纪念日倒数日项目的实现-【纪念时刻-时光集】

纪念日/倒数日项目的实现## 一个练手的小项目&#xff0c;uniappnodemysql七牛云。 在如今快节奏的生活里&#xff0c;大家都忙忙碌碌&#xff0c;那些具有特殊意义的日子一不小心就容易被遗忘。今天&#xff0c;想给各位分享一个“纪念日”项目。 【纪念时刻-时光集】 一…

deepseek的CoT优势、两阶段训练的有效性学习笔记

文章目录 1 DeepSeek的CoT思维链的优势1.2 open-r1的CoT训练数据1.3 ReAct任务与CoT任务适用场景 2 AI推理方向&#xff1a;deepseek与deepmind的两条路线的差异2.1 PRM与ORM的两大学派分支的差异2.2 DeepSeek-R1的两阶段训练概述 1 DeepSeek的CoT思维链的优势 DeepSeek跟之前…

大语言模型实践——基于现有API的二次开发

基于现有的API平台做一些实用的AI小应用。 API服务商&#xff1a;阿里云百炼 云服务器&#xff1a;阿里云&#xff08;2核2GB&#xff09; 部署框架&#xff1a;gradio 调用框架&#xff1a;openai 语言&#xff1a;Python &#xff08;注&#xff1a;若搭建网站或API接口…

STM32 RTC 实时时钟说明

目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…

Node.js 中实现多任务下载的并发控制策略

1、背景与需求 在实际开发中&#xff0c;我们常常需要从多个源下载文件&#xff0c;例如从多个服务器下载图片、视频或音频文件。如果不加以控制&#xff0c;同时发起过多的下载任务可能会导致服务器过载&#xff0c;甚至引发网络拥堵。因此&#xff0c;合理控制并发数量是实现…

【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)

目录 一、引言 1.1 本篇文章侧重点 1.2 技术洞察—MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 二、MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场…

防火墙是什么?详解网络安全的关键守护者

当今信息化时代&#xff0c;企业和个人在享受数字生活带来的便利时&#xff0c;也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件&#xff0c;就像一道牢不可破的防线&#xff0c;保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么&#xff1f;…

DeepSeek模型架构及优化内容

DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…

蓝桥杯---N字形变换(leetcode第6题)题解

文章目录 1.问题重述2.例子分析3.思路讲解4.代码分析 1.问题重述 这个题目可以是Z字形变换&#xff0c;也可以叫做N字形变换&#xff1a; 给定我们一串字符&#xff0c;我们需要把这串字符按照先往下写&#xff0c;再往右上方去写&#xff0c;再往下去写&#xff0c;再往右上…

LogicFlow自定义节点:矩形、HTML(vue3)

效果&#xff1a; LogicFlow 内部是基于MVVM模式进行开发的&#xff0c;分别使用preact和mobx来处理 view 和 model&#xff0c;所以当我们自定义节点的时候&#xff0c;需要为这个节点定义view和model。 参考官方文档&#xff1a;节点 | LogicFlow 1、自定义矩形节点 custo…

19.3 连接数据库

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 ​​​​​​​需要北风数据库的请留言自己的信箱。 连接数据库使用OleDbConnection&#xff08;数据连接&#xff09;类&#xff…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…

JavaEE架构

一.架构选型 1.VM架构 VM架构通常指的是虚拟机&#xff08;Virtual Machine&#xff09;的架构。虚拟机是一种软件实现的计算机系统&#xff0c;它模拟了物理计算机的功能&#xff0c;允许在单一物理硬件上运行多个操作系统实例。虚拟机架构主要包括以下几个关键组件&#xff…

[笔记] 汇编杂记(持续更新)

文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…

如何在Linux中设置定时任务(cron)

在Linux系统中&#xff0c;定时任务是自动执行任务的一种非常方便的方式&#xff0c;常常用于定期备份数据、更新系统或清理日志文件等操作。cron是Linux下最常用的定时任务管理工具&#xff0c;它允许用户根据设定的时间间隔自动执行脚本和命令。在本文中&#xff0c;我们将详…

【MySQL】我在广州学Mysql 系列—— 数据备份与还原

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周一&#xff0c;过两天就是元宵节了&#xff0c;今年元宵节各位又要怎么过呢&#xff01;&#xff01; 本文主要对Mysql数据库中的数据备份与还原内容进行讨论&#xff01;&#xff01; 回顾&#xff1a;&#x1f449;【MySQ…