C语言进阶教程(字符串深入)

news2024/12/29 16:37:13

文章目录

  • 前言
  • 一、字符数组赋值注意事项
  • 二、混淆点
  • 三、字符串字面量和字符数组的区别
  • 四、字符串长度
  • 总结


前言

其实在C语言中是没有真正的字符串的,在C语言中字符串都是使用字符数组来完成的。

一、字符数组赋值注意事项

在C语言中,字符数组(也称为字符串)只能在初始化时进行赋值。这是因为字符数组在声明时需要指定其大小,且其大小在编译时确定。由于数组的大小在编译时确定,并且是静态的,因此无法在运行时对字符数组进行动态赋值。

这意味着在声明字符数组时,必须为其分配足够的空间来存储所需的字符串。

请注意,在字符数组声明后,无法使用赋值运算符来直接更改数组内的内容。例如,以下代码是无效的:

char str[10];
str = "Hello";  // 错误,无法直接赋值给字符数组

如果需要在运行时更改字符串内容,可以使用字符指针来动态分配内存,并使用字符串相关的函数进行操作,例如 strcpy 或 strcat。

二、混淆点

下面举三个比较容易被认为是错误的操作:

1.char b = “abc”[0];
这一行代码使用了字符串字面值 “abc” 并通过索引操作符 [0] 访问其第一个字符。由于字符串在C中是以零终止的字符数组,因此可以将此操作理解为将字符数组的第一个元素赋值给变量 b。因此,b 的值将是 ‘a’。

2.char c = *(“123” + 1);
这一行代码使用字符串字面值 “123” 并通过指针偏移访问其第二个字符。首先,将字符串字面值 “123” 的地址增加 1,得到该位置的指针。然后使用解引用操作符 * 将该指针指向的值赋值给变量 c。因此,c 的值将是 ‘2’。

3.char t = *“”;
这一行代码尝试对一个空字符串 “” 进行解引用操作。然而,空字符串没有有效的内存位置可以解引用。这样的操作将导致未定义行为,并且结果不可预测。在不同的编译器和平台上,可能会产生不同的结果。因此,t 的值是不确定的。

注意:
1.字符串字面量的本质是一个数组

2.字符串字面量可以看作常量指针

3.字符串字面量中的字符不可改变

4.字符串字面量至少包含一个字符

三、字符串字面量和字符数组的区别

字符串字面量和字符数组之间有几个重要的区别:

1.可变性:字符串字面量是不可变的(immutable),而字符数组是可变的(mutable)。这意味着字符串字面量的内容无法在运行时修改,而字符数组可以通过索引进行修改。例如,可以对字符数组中的特定位置赋予新值,但不能对字符串字面量中的字符进行更改。

2.存储位置:字符串字面量通常存储在只读存储区(如常量区或只读数据段),这意味着它们的内容无法修改。而字符数组在栈或堆中分配内存,具有可读写的特性。

3.大小调整:字符串字面量的大小是在编译时决定的,它们的长度由引号内的字符确定。字符数组的大小可以在编译时或运行时决定,可以根据需求进行调整。

4.初始化:字符串字面量可以直接赋值给一个指针变量,而字符数组在声明时需要显式地指定大小,并使用字符串拷贝函数或字符赋值来进行初始化。

5.零终止字符:字符串字面量自动以零终止字符(\0)结束,可以直接用作C语言的字符串。对于字符数组,需要注意手动添加零终止字符来表示字符串的结束。

总结起来,字符串字面量是不可变且常量的,存储在只读存储区;而字符数组是可变的,存储在栈或堆上,并且可以通过索引修改其内容。字符串字面量在编译时大小确定,而字符数组在编译时或运行时大小可变。在使用字符串时,应根据需要选择适合的类型,以确保正确的行为和操作。

// 字符串字面量
char* str_literal = "Hello World";

// 字符数组
char str_array[] = "Hello World";

四、字符串长度

字符串的长度是指第一个零终止字符 (\0) 出现之前的字符个数。

int main(int argc, char** argv)
{
    char str[] = "Hello\0 World";


    printf("str len : %d\n", strlen(str));

    return 0;
}

运行结果:
在这里插入图片描述

总结

本篇文章就讲解到这里,下篇文章继续讲解字符串。

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

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

相关文章

[RocketMQ] Producer生产者启动源码 (五)

DefaultMQProducer的关系图: 文章目录 1.创建DefaultMQProducer实例2.start启动生产者2.1 getOrCreateMQClientInstance获取或者创建MQClientInstance2.2 registerProducer注册生产者2.3 start启动MQClientInstance2.4 startScheduledTask启动各种定时任务2.4.1 updateTopicRou…

【Linux】切换内核版本(Centos)

1.查看服务器已安装的所有内核版本 awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg0 : CentOS Linux (3.10.0-1160.83.1.el7.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-1160.80.1.el7.x86_64) 7 (Core) 2 : CentOS Linux (3.10.0-1127.el7.…

求最小函数依赖集(例题讲解)超详细,易理解

在关系R<U,F>中&#xff0c;UABCDEG F{BG->C&#xff0c;BD->E,DG->C,ADG->BC,AG->B,B->D} 先进行第一大步&#xff1a; 先看右边&#xff1a; 如果有BG->C,G-->C,因为单G就可以推出C了就不需要BG--->C了&#xff0c;可以把BG--->C这个…

Segment Anything Model(SAM)

Segment Anything Model&#xff08;SAM&#xff09;是Facebook Research近来开源的一种新的图像分割任务、模型。Segment Anything Model&#xff08;SAM&#xff09;可以从输入提示&#xff08;如点或框&#xff09;生成高质量的对象掩模&#xff0c;并可用于生成图像中所有对…

1、一条 SQL 查询语句是如何执行的?

基础篇 第一课、一条 SQL 查询语句是如何执行的&#xff1f; 下面是 MySQL 的基本架构示意图&#xff0c;从中可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存…

AI近十年盘点:纵览AI发展历程,探寻AI未来走向

编者按&#xff1a;当我们回顾过去十年的人工智能发展历程时&#xff0c;可以看到一场现在还正在进行的变革&#xff0c;对我们的工作方式、商业运营模式和人际交往行为都产生了深远的影响。从2013年的AlexNet到变分自编码器&#xff0c;再到最近的生成式大模型&#xff0c;人工…

Vue 2 - 常见面试题汇总大全

文章目录 一 基础知识1.vue 的生命周期1-1 钩子函数1-2 钩子函数的使用方法1-3 父子组件生命周期构造函数执行顺序 2 v-show 与 v-if v-for2-1.v-show 与 v-if 的区别2-2 v-if 和v-for的优先级 3.组件通信有哪些方式&#xff1f;4 computed和watch &#xff0c;有什么区别4-1.c…

西门子S7-1200定时器

一、西门子S7-1200定时器介绍 S7-1200的定时器为IEC定时器&#xff0c;用户程序中可以使用的定时器数量仅仅受CPU的存储器容量限制。 使用定时器需要使用定时器相关的背景数据块或者数据类型为IEC_TIMER&#xff08;或TP_TIME、TON_TIME、TOF_TIME、TONR_TIME&#xff09;的D…

别再弄混流程挖掘、BPM和BI

信息时代以来&#xff0c;各类信息系统不仅在企业中得到了广泛的应用和普及&#xff0c;种类和选择伴随全球数字技术的发展也逐渐变得丰富多样。而随着数字化转型的不断深入&#xff0c;企业对系统管理的需求面临着全新的变化。 如何配置最适合当下业务的系统&#xff1f;这个…

Axure教程——图片轮播(纵向滚动)

本文介绍的时用Axure中的动态面板制作图片轮播之纵向滚动 一、预览效果 预览地址&#xff1a;https://c1s4i1.axshare.com 二、功能描述 图片纵向自动滚动播放 三、元件制作 拖入一个动态面板&#xff0c;命名为1&#xff0c;设置大小为375*155&#xff0c;并设置四个状态&…

文科生从0学Python转数据分析学习建议避坑指南

我本科是财务管理&#xff0c;文科专业&#xff0c;零基础学习Python转行数分后&#xff0c;现在我的日常工作都离不开它。 接下来&#xff0c;给各位跟我一样无编程经验的朋友一些学习的建议 目标导向&#xff1a;先搞清楚为啥要学 Python几乎可以做任何事&#xff0c;但我…

2023汽车供应链大会暨爱普搜采购商交流会

2023汽车供应链大会暨爱普搜采购商交流会 Automotive Supply Chain Conference & APSOTO Purchasing Exchange Meeting 补链强链 绿色发展--打造中国汽车供应链新生态 北京是我国汽车工业重地之一&#xff0c;产业实力雄厚&#xff0c;发展强劲。北京车企及零部件公司分布…

springboot高校宿舍报修管理系统计算机毕设 附源码83946

springboot高校宿舍报修管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实…

VUE L 事件处理 ⑤

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs E v e n t j s Eventjs Eventjs总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ ⡖⠒⠒⠒⠤⢄⠀⠀⠀…

Java反射机制以及应用

Java反射机制以及应用 1、Java反射 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性(包括私有的方法和属性)&#xff0c;这种动态获取的信息以及动态调用对…

【推荐】免费PDF编辑修改软件排行榜Top11!

随着组织进入数字时代&#xff0c;他们需要处理大量数字文档&#xff0c;尤其是 PDF。PDF 是数字文档中使用最广泛的文件格式之一&#xff0c;能够编辑 PDF 文件至关重要。PDF编辑并不是任何软件都能轻松完成的。不过&#xff0c;网络上有大量免费、开源的 PDF 编辑软件可以帮助…

基于Springboot+vue+协同过滤+前后端分离+电子产品推荐系统(用户,多商户,管理员)+全套视频教程

基于Springbootvue协同过滤前后端分离电子产品推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载 链接&#xff1a;https://pan.baidu.com/s/1ckCKm4zKT0m4RqfHULYyOg 提取码&#xff1a;8888 【运行环境】Idea JDK1.8 Maven MySQL …

基于Servlet+JDBC实现的基础博客系统>>系列2 -- 前端基础页面

目录 1. 博客公共页面样式 2. 博客列表页 3. 博客详情页 4. 博客登录页 5. 博客编辑页 1. 博客公共页面样式 导航栏以及背景图设置 <body> <!-- 1.navigation 导航栏 --><div class"nav"><!-- logo --><img src"image/logo.png&q…

【深圳触觉智能技术分享】Purple Pi OH Android11 ROOT 方法

为了让应用程序可以直接调用su执行系统命令和获取root权限&#xff0c;本文基于Purple Pi OH主板的Android SDK&#xff0c;介绍如果修改和编译一个root版本的Android11系统,以下为sdk源码修改方法。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (…

【yocto2】利用yocto工具构建嵌入式Linux系统

1.定制化嵌入式linux系统 在实际项目中&#xff0c;一款嵌入式产品往往具有不同的硬件平台和软件需求&#xff0c;因此需要对嵌入式Linux系统进行定制&#xff0c;以满足不同的产品需求。之前的章节中基于Freescale官方提供的例程&#xff0c;构建了运行于imx6ull14x14evk硬件…