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…

crontab制定任务计划删除超过5天以上的文件

文章目录 1.find命令的基本用法2.编写脚本3.制定任务计划4.制定任务计划后一定要重启一下crontab服务1.find命令的基本用法 #查询/data/docker/overlay2/目录下的host.access.log文件 find /data/docker/overlay2/ -path */log/nginx/host.access.log -print #删除/root/da…

有哪些免费的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;想给各位分享一个“纪念日”项目。 【纪念时刻-时光集】 一…

蓝桥杯备赛 Day13.1走出迷宫

链接&#xff1a;走出迷宫 题目描述 小明现在在玩一个游戏&#xff0c;游戏来到了教学关卡&#xff0c;迷宫是一个N*M的矩阵。 小明的起点在地图中用“S”来表示&#xff0c;终点用“E”来表示&#xff0c;障碍物用“#”来表示&#xff0c;空地用“.”来表示。 障碍物不能通…

ubuntu系统借助windows系统代理实现上网的做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 目前有这样一个场景&#xff1a;ubuntu系统装在一个嵌入式设备上&#xff0c;嵌入式设备只有一个网口&#xff0c;现在你手头有一台装有windows10系统的笔记本电脑&#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跟之前…

BeginInvoke和Invoke的使用时机

在 WinForms 中&#xff0c;Control.BeginInvoke 和 Control.Invoke 都用于在 UI 线程上执行代码&#xff0c;但它们的核心区别在于 阻塞行为 和 线程调度方式。以下是 BeginInvoke 相比 Invoke 的主要优势&#xff1a; 1. 非阻塞调用 Invoke&#xff08;同步调用&#xff09;&…

大语言模型实践——基于现有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为…

Prometheus监控系列 | blackbox_exporter配置实战

Prometheus监控系列 | blackbox_exporter配置实战 1. blackbox简介2. blackbox_exporter部署2.1. 下载安装包2.2. 配置启动文件3. blackbox_exporter配置文件详解3.1. HTTP监控3.2. TCP监控3.3. ICMP监控4. 监控域名SSL证书的到期时间5. 配置Prometheus配置文件6. Grafana监控展…

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

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

HTML应用指南:利用POST请求获取接入比亚迪业态的充电桩位置信息

在新能源汽车快速发展的今天,充电桩的分布和可用性成为了影响用户体验的关键因素之一。比亚迪作为全球领先的新能源汽车制造商,不仅在车辆制造方面取得了卓越成就,也在充电基础设施建设上投入了大量资源。为了帮助用户更方便地找到比亚迪充电桩的位置,本篇文章,我们将探究…

【经验分享】Linux 系统安装后内核参数优化

在 Linux 系统安装后&#xff0c;进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作&#xff1a; 修改/etc/sysctl.conf 文件 执行sysctl -p使配置生效。 kernel.shmmax 135185569792 kernel.shmall 4294967296 fs.aio-max-nr 3145728 fs.fi…

【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;…

Windows系统下设置Vivado默认版本:让工程文件按需打开

在FPGA开发过程中&#xff0c;我们常常需要在一台电脑上安装多个不同版本的Vivado软件&#xff0c;以满足不同项目的需求。然而&#xff0c;当双击打开一个Vivado工程文件&#xff08;.xpr&#xff09;时&#xff0c;系统默认会调用一个固定的版本&#xff0c;这可能并不是我们…

DeepSeek模型架构及优化内容

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