C语言——字符串两种声明初始化方式、输入输出及常见处理函数

C语言中的字符串是一个字符数组,它以空字符(\0作为结束标志。这意味着字符串中的字符是连续存储在内存中的,而字符串的末尾会自动添加一个\0字符来表示字符串的结束。这种表示方式使得C语言在处理字符串时非常灵活,但也要求程序员在创建和修改字符串时小心处理,以避免缓冲区溢出等安全问题。

字符串的声明和初始化

1. 字符数组初始化

当你使用字符数组来定义字符串时,你可以在声明时直接初始化它,或者稍后通过其他方式(如strcpy函数)来填充它。

直接初始化
char str[] = "Hello, World!";

这种方式会在编译时自动将字符串"Hello, World!"(包括结尾的空字符\0)复制到str数组中。数组str的大小将自动根据初始化的字符串长度加上一个空字符(\0来确定,因此在这个例子中,str数组的大小至少是14个字节(13个字符加上一个空字符)。

未初始化

你也可以声明一个字符数组但不立即初始化它,稍后再使用strcpy或类似函数来填充它。

char str[20]; // 声明一个可以存储19个字符加上一个空字符的数组  
strcpy(str, "Hello, World!"); // 使用strcpy函数初始化

注意,在使用strcpy之前,你需要确保目标数组str足够大,以容纳要复制的字符串及其结尾的空字符。

2. 指针指向字符串常量

另一种定义字符串的方式是使用指针指向一个字符串常量。字符串常量本身是一个存储在只读内存区域的字符数组,并且以空字符\0结尾。

const char *ptr = "Hello, World!";

在这个例子中,ptr是一个指向const char的指针,它指向字符串常量"Hello, World!"的首字符。注意这里使用了const关键字,因为字符串常量通常存储在只读内存区域,尝试修改它们会导致未定义行为。 

区别

  • 内存分配和存储:使用字符数组定义的字符串存储在栈上(如果是局部变量)或堆上(如果是动态分配的),而字符串常量存储在只读数据段。
  • 可修改性:字符数组中的字符串是可以修改的,而字符串常量是不可修改的(尽管C语言标准允许不将字符串常量存储在只读内存区域,但大多数现代编译器都会这样做)。
  • 大小自动确定:当使用字符数组并直接初始化它时,数组的大小会自动根据字符串的长度(包括空字符)来确定。而使用指针指向字符串常量时,你不需要(也不能)指定字符串的大小,因为字符串常量的大小是固定的。
  • 性能:在大多数情况下,这两种方式在性能上的差异是微不足道的。然而,如果你在处理大量字符串或需要频繁地复制和修改字符串时,使用字符数组可能会更加高效,因为你可以更直接地控制内存的使用。

字符串的输入输出

输入

C语言标准库中没有直接读取字符串的输入函数,但可以使用scanf函数或fgets函数等。scanf函数在读取字符串时遇到空格、制表符或换行符会停止读取,而fgets函数会读取整行直到遇到换行符或达到指定的字符数限制(包括换行符),并将换行符也存储到字符串中(如果需要,可以手动去除)。

#include <stdio.h>  char str[100];  
printf("Enter a string: ");  
fgets(str, sizeof(str), stdin); // 使用fgets读取一行  
// 如果需要,可以去除字符串末尾的换行符  
str[strcspn(str, "\n")] = 0;
输出

字符串的输出通常使用printf函数:

#include <stdio.h>  char str[] = "Hello, World!";  
printf("%s\n", str); // 输出字符串

字符串处理函数简介

C语言标准库提供了一系列用于字符串处理的函数,这些函数定义在string.h头文件中。常见的字符串处理函数包括:

  • strlen:计算字符串的长度(不包括\0)。
  • strcpy:复制字符串。
  • strcat:连接两个字符串。
  • strcmp:比较两个字符串。
  • strchr:查找字符串中首次出现指定字符的位置。
  • strstr:查找字符串中首次出现指定子串的位置。
  • sprintf:将格式化的数据写入字符串。

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

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

相关文章

第1关 -- Linux 基础知识

闯关任务 完成SSH连接与端口映射并运行hello_world.py ​​​​ 可选任务 1 将Linux基础命令在开发机上完成一遍 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 创建新的虚拟环境lm3 可选任务 3 创建并运行test.sh文件 参考文档 文档&#xff1a;https://g…

【MySQL-19】一文带你了解存储函数

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

ROS2中间件

ROS2 是重新设计的 Robot Operating System&#xff0c;无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。 1. 通信模式 ROS2 使用DDS协议进行数据传输&#xff0c;并通过抽象的rmw&#xff0c;支持多个厂家的DDS实现&#xff08;FastDDS&#xff0c;Cyc…

Python 和 R两者的主要区别和优缺点对比

有个问题&#xff0c;既然做模型调的还是python&#xff0c;那为啥很多人还用R呢&#xff1f; 这是一个很好的问题。Python 和 R 都是数据科学和统计分析领域中非常流行的编程语言&#xff0c;它们各有优缺点&#xff0c;选择哪种语言通常取决于具体的任务需求、个人或团队的技…

【链表】算法题(二) ----- 力扣/牛客

一、链表的回文结构 思路&#xff1a; 找到链表的中间节点&#xff0c;然后逆置链表的后半部分&#xff0c;再一一遍历链表的前半部分和后半部分&#xff0c;判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…

Java 如何实现单点登录案例详解

单点登录&#xff08;SSO&#xff09;是一种用户身份验证机制&#xff0c;允许用户在多个系统或应用程序中使用同一组登录凭据。从业务需求的角度来看&#xff0c;单点登录具有以下优势和必要性&#xff1a; 从业务需求的角度来看&#xff0c;单点登录具有以下优势和必要性&am…

梧桐数据库:数据库技术中表的统计信息技术详解

在数据库技术中&#xff0c;表的统计信息主要用于查询优化等方面&#xff0c;以下是对其的详细解释&#xff1a; 作用&#xff1a; 帮助查询优化器做出更合理的执行计划决策&#xff0c;以提高查询性能。 常见的统计信息类型&#xff1a; 行数&#xff08;Row count&#xf…

Transformer是怎样处理序列数据的?

Transformer模型最初是一种广泛应用于自然语言处理&#xff08;NLP&#xff09;和其他序列建模任务的架构。它由编码器&#xff08;encoder&#xff09;和解码器&#xff08;decoder&#xff09;组成。 以下是Transformer模型输入和输出的详细介绍&#xff1a; 输入 1. 输入…

Pandas库学习之dataframe.corr()函数

Pandas库学习之dataframe.corr()函数 一、简介 dataframe.corr()是Pandas库中的一个函数&#xff0c;用于计算DataFrame中各列之间的相关系数。相关系数衡量的是两个变量之间线性关系的强度和方向&#xff0c;结果在-1到1之间&#xff0c;分别表示完全负相关和完全正相关。 二…

前端代码审查大纲

一、代码审查的目的 提升代码质量&#xff1a;代码审查可以发现代码中的错误、漏洞、不符合规范的地方&#xff0c;从而及时进行修正。这有助于提升代码的稳定性和可靠性&#xff0c;减少运行时出现的问题。 统一编码标准和风格&#xff1a;代码审查可以确保团队成员遵循统一的…

Maven学习——Maven的下载、安装与配置(详细攻略!)

目录 前言 1.下载与安装 2.配置Maven的环境变量 3.配置Maven的本地仓库 4. 配置Maven的镜像远程仓库 前言 我在之前写了一篇博客&#xff0c;是介绍Maven的基本概念和下载安装&#xff0c;但是由于篇幅过长&#xff0c;Maven的下载与安装写的并不详细&#x1f436;&#x…

TCP三次握手与四次挥手详解

1.什么是TCP TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;属于互联网协议族&#xff08;TCP/IP&#xff09;的一部分。TCP 提供可靠的、顺序的、无差错的数据传输服务&…

TeamViewer手机端APP提示:请先验证账户

当你在手机端下载安装了TeamViewerAPP后&#xff0c;需要你先登录个人账号&#xff0c;然后还会要求你验证账户&#xff0c;同时跳转到一个网址中&#xff0c;但是这个网址并没有自动跳转到验证账户的位置。 解决办法&#xff1a; 在手机浏览器中进入下面这个网址&#xff1a;…

SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1

一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…

分布式搜索引擎ES-elasticsearch入门

1.分布式搜索引擎&#xff1a;luceneVS Solr VS Elasticsearch 什么是分布式搜索引擎 搜索引擎&#xff1a;数据源&#xff1a;数据库或者爬虫资源 分布式存储与搜索&#xff1a;多个节点组成的服务&#xff0c;提高扩展性(扩展成集群) 使用搜索引擎为搜索提供服务。可以从海量…

算法基础之回溯法

本文将详细介绍回溯法的基本原理和适用条件&#xff0c;并通过经典例题辅助读者理解回溯法的思想、掌握回溯法的使用。本文给出的例题包括&#xff1a;N皇后问题、子集和问题。 算法原理 在问题的解空间树中&#xff0c;回溯法按照深度优先的搜索策略&#xff0c;从根结点出发…

IP溯源工具--IPTraceabilityTool

工具地址&#xff1a;xingyunsec/IPTraceabilityTool: 蓝队值守利器-IP溯源工具 (github.com) 工具介绍&#xff1a; 在攻防演练期间&#xff0c;对于值守人员&#xff0c;某些客户要求对攻击IP都进行分析溯源&#xff0c;发现攻击IP的时候&#xff0c;需要针对攻击IP进行分析…

Hive理论讲解

Hive介绍 1、Hive本质 Hive本质是【数仓设计方案】&#xff0c;hive本身并不存储数据【数据包含&#xff1a;元数据 (表)数据】。 2、hql和sql对比 sql 结构化查询语言【structured query language】hql hive/hadoop类sql查询语言【hive/hadoop query language like sql…

Python学习笔记40:游戏篇之外星人入侵(一)

前言 入门知识已经学完&#xff0c;常用标准库也了解了,pygame入门知识也学了&#xff0c;那么开始尝试小游戏的开发。 当然这个小游戏属于比较简单的小游戏&#xff0c;复杂的游戏需要长时间的编写累计开发经验&#xff0c;同时也需要一定的时间才能编写出来。现在的话还是嫩…

2024年7月16日(使用光盘创建本地仓库,引入网络镜像仓库,创建自建仓库)

了解yum源安装包的特点 了解常用的网络yum源 掌握本地和网络yum源的配置 能够使用yum工具安装软件包 rpm -ivh xxx 手动添加依赖 yum不止执行安装&#xff0c;会自动处理依赖安装 1、yum优点 rpm安装 &#xff08;下载软件 单独安装 需要解决依赖关系&#xff09; 源码安装 &am…