C语言字符串

字符串

字符串字面量

字符串字面量是用一对双引号括起来的字符序列。
例:"When you come to a fork in the road,take it."

延续字符串字面量

如果发现字符串字面量太长而无法放置在单独一行以内,只要把第一行用字符 \ 结尾,那么 C 语言就允许在下一行延续字符串字面量。

printf("When you come to a fork in the road, \
take it. --Yogi Berra");

除了(看不到的)末尾的换行符,在同一行不可以有其他字符跟在 \ 后面。
使用\有一个缺陷:字符串字面量必须从下一行的起始位置继续。

如何存储字符串字面量

从本质而言,C语言把字符串字面量作为字符数组来处理。
当C语言编译器在程序中遇到长度为 n 的字符串字面量时,它会为字符串字面量分配长度为 n+1 的内存空间。
这块内存空间将用来存储字符串字面量中的字符,以及一个用来标志字符串末尾的额外字符(空字符)。
空字符是一个所有位都为 0 的字节,用转义序列“\0”来表示。

字符串字面量的操作

通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。

char * p;
p = "abc";  //p存储字符串首字母所在地址

C语言允许对指针取下标,因此可以对字符串字面量取下标:

char ch;       
ch = "abc"[1];  //ch存储字符b

字符串字面量与字符常量

只包含一个字符的字符串字面量不同于字符常量。
'a'"a" 为例:

  • 字符串字面量 "a" 是用指针来表示的,这个指针指向存放字符 'a' 的内存单元。
  • 字符常量 'a' 是用整数(字符集的数值码)来表示的。
  • 字符串字面量 "a" 是两个字符,隐含了一个空字符“\0”。
  • 字符常量 'a' 仅代表自身一个字符。

字符数组

字符数组可以使用字符串字面值初始化:

char data[8] = { "June 14" }; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0'}; 
char data[8] = "June 14";     //可以省略花括号 

编译器将把字符串中的字符复制到数组中,然后追加一个空字符 “\0”,从而使该数组可以作为字符串使用。
计算数组长度一定要计算空字符。
如果初始化式太短以致于不能填满字符数组,编译器会将剩余空间添加空字符 “\0”。

char data[9] = "June 14"; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0','\0'};

在字符数组的定义中可以省略它的长度;这种情况下,编译器会自动计算长度:

char data[] = "June 14"; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0'};

当字符数组逐个字符赋值初始化时,需手动添加“\0”结束符。
例:char c[] = {'I',' ','a','m',' ','h','a','p','p','y','\0'};

字符数组和字符指针的比较

char data[] = "June 14"; //字符数组 
char * data = "June 14"; //字符指针
  • 字符数组由若干字符序列组成,而字符指針变量中存放的是地址。
  • 可以对字符指针变量赋值,但不能对数组名赋值。
  • 字符数组分配若干存储单元,字符指针变量只分配一个存储单元。
  • 字符指针变量的指向可以改变,但数组名不能改变。
  • 字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。

字符串数组

二维的字符数组

例:

char planets[][8] = {"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto");

存储 8 个字符串,即二维数组有 8 行;字符个数最大为 8,即二维数组有 8 列。
并非所有的字符串都足以填满数组的一整行,所以 C 语言用空字符来填补。

指向字符串的指针数组

字符型指针数组,存放字符串的起始地址。

char* str[] = { "C++","Python","Java","BASIC" };
printf("%s\n", str[2] ); //输出str[2]指向的字符串 Java
printf("%c\n", *str[2] );//输出str[2]指向的字符串中的第一个字符 J
char** p = str + 2;
printf( "%s\n", *p );  //输出str[2]指向的字符串 Java
printf( "%c\n", **p ); //输出str[2]指向的字符串中的第一个字符 J

命令行参数

命令行信息不仅对操作系统命令可用,它对所有程序都是可用的。
为了能够访问这些命令行参数(C标准中称为程序参数),必须把 main 函数定义为含有两个参数的函数,这两个参数通常命名为 argc 和 argv:

int main(int argc, char *argv[])
{
}

argc(“参数计数”)是命令行参数的数量(包括程序名本身)
argy(“参数向量”)是指向命令行参数的指针数组,这些命令行参数以字符串的形式存储。
argv[0] 指向程序名,而从 argy[1]argv[argc-1] 则指向余下的命令行参数。
argv 有一个附加元素,即argy[argc],这个元素始终是一个空指针。

字符串处理函数

C语言的函数库为完成对字符串的操作提供了丰富的函数集。
这些函数的原型驻留在<string.h>头文件中。

字符串连接函数 strcat

			格式: strcat (字符数组1,字符数组2)

功能:把字符数组 2 中的字符串连接到字符数组 1中 字符串的后面,并删去字符串1后的串标志“\0”。
本函数返回值是字符数组 1 的首地址。

函数原型
char* strcat(char* s1,const char* s2);

字符串复制函数 strcpy

			格式: strcpy (字符数组1,字符数组2)

功能:把字符数组 2 中的字符串拷贝到字符数组 1 中;串结束标志“\0”也一同拷贝。
说明:
字符数组 1 必须足够大,以容纳字符数组 2。
字符数组 1 必须是一个字符数组名。
字符数组 2 可以是一个字符数组名,也可以是一个字符串常量。
一个字符串拷贝到另一个字符数组中去,只能使用 strcpy 函数。
可以使用 strncpy 函数将字符串 2 中前面 n 个字符复制到原来字符数组 1 中前面 n 个字符。

函数原型
char* strcpy(char* s1,const char* s2);

字符串比较函数 strcmp

			格式: strcmp(字符串1,字符串2)

功能:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到“\0”为止。

  • 字符串1 = 字符串2,返回值 = 0;
  • 字符串1 < 字符串2,返回值 < 0;
  • 字符串1 > 字符串2,返回值 > 0。
函数原型
char* strcpy(const char* s1,const char* s2);

字符串长度函数 strlen

		 格式:strlen(字符数组)

功能:测试字符串实际长度。
也可直接测试字符串常量的长度:strlen("China");

函数原型
char* strlen(const char* s1);

转换小写字母的函数 strwr

			格式:strwr(字符串)

功能:将字符串中大写字母换成小写字母。

转换大写字母的函数 strupr

			格式:strupr(字符串)

功能:将字符串中小写字母换成大写字母。

字符串输出函数 puts

			格式: puts (字符数组)

功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。
在写完字符串后,puts 函数总会添加一个额外的换行符,从而前进到下一个输出行的开始处。

字符串输入函数 gets

			格式: gets (字符数组)

功能:从标准输入设备键盘上输入一个字符串。
gets 函数得到一个函数值,即为该字符数组的首地址。
gets 函数不会在开始读字符串之前跳过空白字符(scanf 函数会跳过)。
gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。
此外,gets 函数会忽略掉换行符,不会把它存储到数组中,用空字符代替换行符。

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

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

相关文章

深入解析Selenium动作链:精通点击、拖拽、切换等操作

背景&#xff1a; 一些交互动作都是针对某个节点执行的。比如&#xff0c;对于输入框&#xff0c;我们就调用它的输入文字和清空文字方法&#xff1b;对于按钮&#xff0c;就调用它的点击方法。其实&#xff0c;还有另外一些操作&#xff0c;它们没有特定的执行对象&#xff0…

中国信通院王蕴韬:从“好用”到“高效”,AIGC需要被再次颠覆

当下AIGC又有了怎样的颠覆式技术&#xff1f;处于一个怎样的发展阶段&#xff1f;产业应用如何&#xff1f;以及存在哪些风险&#xff1f;针对这些问题&#xff0c;我们与中国信通院云计算与大数据研究所副总工程师王蕴韬进行了一次深度对话&#xff0c;从他哪里找到了这些问题…

C#中的警告CS0120、CS0176、CS0183、CS0618、CS8600、CS8602、CS8604、CS8625及处理

目录 一、CS0120 二、CS0176 1.解决前 2.解决后 3.解决办法 三、CS0183 四、CS0618 五、CS8600 六、CS8602 七、CS8622 1. 解决前&#xff1a; 2. 解决后&#xff1a; 3.解决方法&#xff1a; 八、CS8604和CS8625 一、CS0120 严重性 代码 说明 项目 文件 行…

电路 buck-boost相关知识

BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识&#xff0c;于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…

邮件泄密案例分析

近日&#xff0c;一起令人震惊的事件在美军方内部引发了广泛关注。据报道&#xff0c;美军方意外将数百万封包含敏感信息的邮件发至非洲国家马里。这些邮件涉及的内容十分广泛&#xff0c;包括军事行动计划、人员部署、战术策略等&#xff0c;甚至还有部分涉及国家安全和战略决…

前缀和——238. 除自身以外数组的乘积

文章目录 &#x1f377;1. 题目&#x1f378;2. 算法原理&#x1f365;解法一&#xff1a;暴力求解&#x1f365;解法二&#xff1a;前缀和&#xff08;积&#xff09; &#x1f379;3. 代码实现 &#x1f377;1. 题目 题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&a…

代码随想录算法训练营第五十八天|739. 每日温度、496. 下一个更大元素 I

第十章 单调栈part01 739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用…

小程序项目:springboot+vue基本微信小程序的学生健康管理系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

C++ Qt QDataStream用法介绍

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 基本使用QDataStream写入数据QDataStream读取数据数据流版本错误处理复杂类型自定义类型示例注意事项Qt中QDataStream 提供了一种与平台无关的方式来序列化二进制数据。这意味…

武汉教育E卡通学生证照片尺寸要求及证件照集中采集方法

”武汉教育E卡通“电子学生证旨在数字化中小学生身份&#xff0c;提供通用的教育卡&#xff0c;实现身份认证的电子化、权威化和集成化。校内一卡通系统包括刷卡考勤、电子班牌、图书借阅等&#xff0c;全面记录学生在校业务。同时&#xff0c;采集社会通行、实践活动等数据&am…

vue子组件修改prop的值

1.通过sync修饰符配合$emit&#xff0c;update实现 父组件&#xff1a; <template><child-view :num.sync"num"></child-view> </template> <script>import childView from ./assembly/childexport default {components: {childView…

PTA 密接判定v1(close_contact1)

Omicron变种病毒传染性太强了&#xff0c;城市屡屡破防。封闭在家的我决定为防疫做点事&#xff1a;帮助筛选密切接触、次密切接触人员。 网格员提供了一些小区的风险时段内的接触记录、确诊人员&#xff0c;需要判断人员的风险分类&#xff1a; A类&#xff1a;疑似病例、临床…

Redis大key与热Key

什么是 bigkey&#xff1f; 简单来说&#xff0c;如果一个 key 对应的 value 所占用的内存比较大&#xff0c;那这个 key 就可以看作是 bigkey。具体多大才算大呢&#xff1f;有一个不是特别精确的参考标准&#xff1a; bigkey 是怎么产生的&#xff1f;有什么危害&#xff1f;…

Redis数据备份和还原

Redis SAVE 命令用于创建当前数据库的备份文件&#xff0c;文件名默认为dump.rdb。备份数据库数据可以增强对数据的保护&#xff0c;提升数据的安全性。当数据不小心丢失或者被删除时&#xff0c;我们就可以通过相应的操作进行数据恢复。本节介绍 Redis 的数据备份和数据还原操…

Android RGB转YUV的算法

将 ARGB&#xff08;Alpha-Red-Green-Blue&#xff09;颜色空间转换为 YUV&#xff08;亮度-色度&#xff09;颜色空间的常用算法有以下几种&#xff1a; 矩阵转换法 使用预定义的转换矩阵将 RGB 值转换为 YUV 值。其中&#xff0c;Y 表示亮度&#xff0c;U 和 V 表示色度。这…

MySQL表的操作『增删改查』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建表1.1.创建时指定属性 2.查看表2.1.查看表结构2.2.查看建表信息…

【SpringCloud】为什么选择微服务?

一般的平台会遇到的问题&#xff1a; 服务配置复杂。基础服务多&#xff0c;服务的资源配置复杂&#xff0c;传统方式管理服务复杂 服务之间调用复杂。检索服务、用户中心服务等&#xff0c;服务之间的调用复杂&#xff0c;依赖多 服务监控难度大。服务比较多&#xff0c;…

MYSQL基础知识之【数据类型】

文章目录 前言标题一数值类型日期和时间类型字符串类型后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错…

CSS:浏览器设置placeholder样式 / 微信小程序设置placeholder样式

一、web 设置placeholder 设置浏览器的placeholder样式 ::-webkit-input-placeholder { /* WebKit browsers */color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */color: #999; } ::-moz-placeholder { /* Mozilla Firefox 19 */color: #999; } :-ms-input-p…

「最优化基础知识2」一维搜索,以及python代码

最优化基础知识&#xff08;2&#xff09; 无约束优化问题&#xff0c;一维搜索 一、一维搜索 一维搜索的意思是在一个方向上找到最小点。 用数学语言描述&#xff0c;X*Xk tPk&#xff0c;从Xk沿着Pk方向行走t到达最小点X*。 1、收敛速度&#xff1a; 线性收敛&#xff1…