C语言——字符串的输出、获取和复制总结

1.输出字符串

(1)puts
char *p = "aha c";
char str[128] = {"hello world"};puts(p);
puts(str);

puts函数会自动在输出后进行换行。

(2)printf
char *p = "aha c";
char str[128] = {"hello world"};printf("%s\n",p);
printf("%s\n",str);

printf函数在输出字符串时使用 %s 进行输出,且没有自动换行功能。

2.获取字符串

(1)scanf
char *p = "aha c";
char str[128] = {"hello world"};puts("请输入字符串:");
scanf("%s",str);

在 scanf 中使用 %s 来获取字符串。

(2)gets

gets函数的用法如下:

char *p = "aha c";
char str[128] = {"hello world"};puts("请再次输入字符串:");
gets(str);

同两个scanf函数一样,在scanf和gets中间需要一个 getchar(); 来吸收掉gets函数输入后的换行符,才能保证程序正常的运行。

3.复制字符串

(1)strcpy

strcpy 是 C 语言标准库函数之一,用于复制字符串。它的全称是 "string copy" 的缩写。strcpy 函数会将源字符串(包括空终止符 '\0')复制到目标字符串中。需要注意的是,目标字符串必须有足够的空间来容纳源字符串的内容,包括结尾的空字符,否则可能会导致缓冲区溢出,这是安全漏洞的常见来源。

函数原型定义在 <string.h> 头文件中,如下所示:

char *strcpy(char *dest, const char *src);
  • dest 是指向目标数组(即字符串)的指针,该数组必须足够大,以容纳要复制的字符串及其终止的空字符。
  • src 是指向要复制的源字符串的指针。

strcpy 函数返回目标字符串 dest 的指针。

示例代码

#include <stdio.h>  
#include <string.h>  int main() {  char src[40] = "Hello, World!";  char dest[50]; // 确保有足够的空间  strcpy(dest, src);  printf("Source: %s\n", src);  printf("Destination: %s\n", dest);  return 0;  
}

输出

Source: Hello, World!  
Destination: Hello, World!

安全注意

由于 strcpy 不会检查目标缓冲区的大小,因此在使用时需要特别小心,以避免缓冲区溢出。为了安全起见,可以考虑使用 strncpy(如果目标缓冲区大小有限制)或 strlcpy(在某些系统中可用,但不是标准 C 的一部分)等更安全的函数。此外,还可以使用 strncat 代替 strcat,以及 snprintf 或 sprintf_s(取决于编译器和平台)等更安全的函数来处理字符串的格式化。

(2)strncpy

strncpy 是 C 语言标准库中的一个函数,用于将一个字符串的前 n 个字符复制到另一个字符串中。这个函数允许程序员指定要复制的字符数,从而提供了一种比 strcpy 更安全的字符串复制方式,特别是当目标缓冲区的大小有限时。

函数原型

strncpy 函数的原型定义在 <string.h> 头文件中,其原型如下:

char *strncpy(char *dest, const char *src, size_t n);
  • dest:指向目标字符串(即要复制到的位置)的指针。
  • src:指向源字符串(即要从中复制的字符串)的指针。
  • n:要复制的最大字符数(包括空字符 '\0',但实际操作中可能不包括自动添加的 '\0')。

函数行为

  1. 复制字符strncpy 将从 src 指向的字符串中复制前 n 个字符到 dest 指向的数组中。
  2. 空字符处理
    • 如果 src 的长度小于 n,则 dest 的剩余部分将被填充空字符 '\0'。
    • 如果 src 的长度大于或等于 n,则 dest 将不会被 '\0' 结尾,这可能导致字符串操作函数(如 strlenstrcpy 等)的行为异常。因此,在使用 strncpy 后,通常需要手动确保目标字符串以 '\0' 结尾。
  3. 返回值strncpy 返回 dest 的指针。

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

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

相关文章

目标检测经典模型之YOLOV5-detect.py源码解析(持续更新)

detect文件框架 一、导入模块包二、定义run函数1. 归一化操作代码解析uint8精度转换归一化 2. 扩展维度为什么扩展维度&#xff1f;代码解释 3. 对检测结果类别计数检查是否有检测结果统计每个类别的出现次数构建描述性字符串 三、定义命令行参数四、主函数 本帖是YOLOV5推理部…

70. 爬楼梯【 力扣(LeetCode) 】

一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 二、测试用例 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶…

CUDA编程00 - 配置CUDA开发环境

第一步&#xff1a; 在一台装有Nvidia显卡和驱动的机器上&#xff0c;用nvidia-smi命令查看显卡所支持cuda版本 第二步&#xff1a; 到Nvidia官网下载CUDA Toolkit并安装&#xff0c;CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可&#xff0c;安装完成用 …

【端智能】端智能技术演进与实践

什么是端智能技术 端智能&#xff08;On-Device Machine Learning&#xff09;是指把机器/深度学习算法模型应用和部署到端设备上&#xff0c;这里“端设备”是相对于云服务而言的&#xff0c;可以是手机&#xff0c;也可以是物联网IoT设备。 Google对端智能的介绍&#xff1…

系统架构设计师教程(清华第二版) 第3章 信息系统基础知识-3.2 业务处理系统-解读

教材中,一会儿“业务处理系统”,一会儿“事务处理系统”,语法毛病一堆。真是清华的水平!!! 系统架构设计师教程 第3章 信息系统基础知识-3.2 业务处理系统 3.2.1 业务处理系统的概念3.2.2 业务处理系统的功能3.2.2.1 数据输入3.2.2.2 数据处理3.2.2.2.1 批处理 (Batch …

计算机体系结构||指令的调度和延迟分布(3)

实验3 指令的调度和延迟分布 3.1实验目的 &#xff08;1&#xff09;加深对指令调度技术的理解。 &#xff08;2&#xff09;加深对延迟分支技术的理解。 &#xff08;3&#xff09;熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。 &#xff08;4&#xff09;进一…

使用AI给编程赋能

传送门&#xff1a;https://www.bilibili.com/video/BV1pf421B71v?p23&vd_source092ecb16e8482a7243d0f8f7718c31a2 1. AIGC AI&#xff08;Artificial Intelligence&#xff09;&#xff1a;人工智能&#xff0c;是计算机科学体系下的一个学科&#xff0c;是指通过计算机…

c# 开发AutoCAD扩展

在C#中开发AutoCAD扩展涉及使用AutoCAD的.NET API&#xff0c; 利用AutoCAD的功能并创建自定义命令、对话框、块、图层和其他图形元素。以下是一些关键步骤和概念&#xff0c;可以帮助你开始使用C#开发AutoCAD扩展&#xff1a; 准备开发环境 安装AutoCAD&#xff1a;确保你有一…

在 macOS 上使用 Jadx 进行 APK 反编译

在 macOS 上使用 Jadx 进行 APK 反编译 Jadx 是一个流行的开源工具&#xff0c;用于将 Android APK 文件反编译成 Java 源代码。本文将详细介绍如何在 macOS 上安装和使用 Jadx&#xff0c;包括之前讨论的内容和步骤。 1. 安装 Jadx 在 macOS 上&#xff0c;可以通过 Homebr…

lua 游戏架构 之 SceneLoad场景加载(一)

设计一个为BaseSceneLoad class&#xff0c;用于处理场景加载的相关操作 &#xff0c;主要作用是提供了一个通用的场景加载框架&#xff0c;使得子类可以按照统一的接口进行场景加载操作。子类需要实现这些方法&#xff0c;以便在加载场景时能够正确地处理场景加载的各个阶段。…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

语义分割——为什么单通道8bit灰度图像能显示多种色块???

目录 一、问题二、解答2.1 标签图的实际存储格式2.2 标签图的显示颜色2.3 颜色映射示例 三、应用颜色映射3.1 OpenCV显示标签图3.2 Matplotlib显示标签图 四、总结 一、问题 大家在做语义分割时不知道有没有这样的疑惑&#xff0c;使用打标签工具后&#xff0c;标签图是单通道…

项目收获总结--大数据量存储架构设计方案

项目收获总结--大数据量存储架构设计方案 一、背景二、数据存储层技术选型2.1 MySQL2.2 MongoDB2.3 HBase2.4 HBaseElasticSearch 三、HBaseElasticSearch基本原理3.1 前置考虑3.2 HBaseElasticSearch优点3.3 HBaseElasticSearch缺点 四、HBaseElasticSearch数据一致性架构4.1 …

大语言模型-Transformer-Attention Is All You Need

一、背景信息&#xff1a; Transformer是一种由谷歌在2017年提出的深度学习模型。 主要用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是序列到序列&#xff08;Sequence-to-Sequence&#xff09;的学习问题&#xff0c;如机器翻译、文本生成等。Transfor…

【UE5】可反射的射线检测

目录 效果 步骤 一、准备射线 二、生成第一次反射后的射线 三、多次反射 四、通过循环进行多次反射 效果 步骤 一、准备射线 1. 新建一个工程&#xff0c;添加一个俯视角游戏资源包 2. 双击打开俯视角游戏地图 删除大纲中的后期处理体积使得地图可以正常显示 3. 添加一…

SAP批量报工源码

SAP批量报工源码,适用于工序少的情景。 *&---------------------------------------------------------------------* *& Report ZPPR106 *& *&---------------------------------------------------------------------* *& *& *&--------------…

网络编程中的TCP和UDP

什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和服务器端必须建立连…

web学习笔记(八十二)uniapp

目录 1.介绍uniapp 2.uniapp项目结构 3.自定义tabBer 4.uniapp条件编译 使用方法 5.uniapp的路由跳转 &#xff08;1&#xff09;js跳转 &#xff08;2&#xff09;标签跳转 获取参数 6.生命周期 6.1 全局生命周期 6.2 页面生命周期 1.介绍uniapp uniapp是一个基于…

Aouth2单点登录

信息来源B站 不改bug早点睡&#xff0c;北冥 时序图 -----------------------------总结描述 总体流程 浏览器 - 系统1 - 系统2 - 认证中心(SSO) 访问系统1 浏览器&#xff0c;访问系统1&#xff0c;询问认证中心是否登录 未登录&#xff0c;重定向一个登录页面返回给浏…

(二)原生js案例之数码时钟计时

原生js实现的数字时间上下切换显示时间的效果&#xff0c;有参考相关设计&#xff0c;思路比较难&#xff0c;代码其实很简单 效果 代码实现 必要的样式 <style>* {padding: 0;margin: 0;}.content{/* text-align: center; */display: flex;align-items: center;justif…