嵌入式Linux系统编程 — 4.3 strcat、strcpy函数拼接与复制字符串

news2024/11/24 17:09:50

目录

1 字符串拼接

1.1 strcat函数

1.2 strncat函数

1.3 示例程序

2  字符串复制

2.1 strcpy函数

2.2 strncpy函数

2.3 示例程序


1 字符串拼接

1.1 strcat函数

在Linux系统中,strcat 函数是C语言标准库中的一个函数,用于将一个字符串追加到另一个字符串的末尾。函数原型如下:

char *strcat(char *dest, const char *src);
  • dest:指向目标字符串的指针,这个字符串有足够的空间来容纳追加后的字符串。
  • src:指向要追加的源字符串的指针。

1.2 strncat函数

strncat 函数用于将一个字符串的一部分追加到另一个字符串的末尾,与 strcat 函数类似,但 strncat 允许你指定最多追加的字符数。函数原型如下:

char *strncat(char *dest, const char *src, size_t n);
  • dest:指向目标字符串的指针,这个字符串有足够的空间来容纳追加后的字符串。
  • src:指向要追加的源字符串的指针。
  • n:要追加的最大字符数。

1.3 示例程序

下面的示例程序从键盘获取两个字符串,然后将它们拼接在一起,并打印出结果:

#include <stdio.h>
#include <string.h>

#define MAX_STR_LEN 100 // 定义字符串的最大长度

int main() 
{
    char str1[MAX_STR_LEN], str2[MAX_STR_LEN], result[MAX_STR_LEN * 2]; // 定义三个字符串数组

    // 获取用户输入的第一个字符串
    printf("请输入第一个字符串:");
    fgets(str1, MAX_STR_LEN, stdin); // 使用fgets来读取一行输入,包括空格

    // 获取用户输入的第二个字符串
    printf("请输入第二个字符串:");
    fgets(str2, MAX_STR_LEN, stdin);

    // 去除可能读取的换行符
    str1[strcspn(str1, "\n")] = 0;
    str2[strcspn(str2, "\n")] = 0;

    // 使用strcat函数将两个字符串拼接
    strcpy(result, str1); // 首先复制第一个字符串到结果字符串
    strcat(result, str2); // 然后将第二个字符串追加到结果字符串的末尾

    // 打印拼接后的字符串
    printf("拼接后的字符串是: %s\n", result);

    return 0;
}

程序首先定义了两个字符串缓冲区,用于存储用户输入的两个字符串,并通过 fgets 函数读取用户输入,同时去除换行符。然后,程序使用 strcpy 函数将第一个字符串复制到两个结果缓冲区,接着使用 strcat 将第二个字符串完整追加到第一个结果缓冲区,而使用 strncat 仅将第二个字符串的前两个字符追加到第二个结果缓冲区。最后程序打印出两种不同的拼接结果。运行结果如下:

2  字符串复制

strcpy()strncpy() 都是C语言标准库中的字符串操作函数,它们用于复制字符串,但是它们在行为上有一些的区别:

2.1 strcpy函数

strcpy() 函数将一个字符串复制到另一个字符串中。strcpy() 不会自动在目标字符串的末尾添加空字符 '\0',如果目标字符串的空间不足,会导致缓冲区溢出。函数原型如下:

char *strcpy(char *dest, const char *src);
  • dest:目标字符串的指针,需要有足够的空间来存储源字符串,包括结尾的空字符 '\0'
  • src:源字符串的指针。

2.2 strncpy函数

strncpy()函数将一个字符串的一部分复制到另一个字符串中,可以指定复制的最大字符数。strncpy() 会复制源字符串 src 的前 n 个字符到目标字符串 dest。如果 src 中的字符少于 n 个,剩余的字符将被填充为 \0,直到 dest 中总共有 n 个字符。如果 src 中的字符多于 n 个,则只有前 n 个字符被复制,dest 中剩余的空间不会被填充为 \0,因此可能不会形成一个以 \0 结尾的字符串。函数原型如下:

char *strncpy(char *dest, const char *src, size_t n);
  • dest:目标字符串的指针。
  • src:源字符串的指针。
  • n:要复制的最大字符数。

2.3 示例程序

下面是一个C语言示例程序,演示如何使用 strcpy()strncpy() 函数来复制用户通过键盘输入的字符串,并打印出两种函数复制的结果:

#include <stdio.h>
#include <string.h>

#define MAX_STR_LEN 100 // 定义字符串的最大长度

int main() 
{
    char src[MAX_STR_LEN]; // 源字符串
    char dest1[MAX_STR_LEN]; // 使用strcpy复制的目标字符串
    char dest2[MAX_STR_LEN + 1]; // 使用strncpy复制的目标字符串,+1是为了确保有足够的空间存储额外的空字符

    // 获取用户输入的字符串
    printf("请输入一个字符串:");
    fgets(src, MAX_STR_LEN, stdin); // 使用fgets来读取一行输入,包括空格

    // 去除可能读取的换行符
    src[strcspn(src, "\n")] = 0;

    // 使用strcpy函数复制整个字符串
    strcpy(dest1, src);
    printf("使用strcpy复制的字符串: %s\n", dest1);

    // 清空dest2以便重新使用
    memset(dest2, 0, sizeof(dest2)); // 使用memset清空dest2

    // 使用strncpy复制前20个字符
    strncpy(dest2, src, 5);
    // 确保dest2以空字符结尾,strncpy可能不会复制空字符
    dest2[20] = '\0';
    printf("使用strncpy复制的字符串: %.20s\n", dest2); // 打印前20个字符

    return 0;
}

程序首先输入一个字符串,然后使用 fgets 读取用户输入,去除末尾的换行符。接着,使用 strcpy 函数将用户输入的字符串完整复制到 dest1,并打印出来。之后,程序使用 memset 清空 dest2,然后用 strncpy 函数复制用户输入的前5个字符到 dest2,并打印出复制的字符串的前20个字符。程序运行结果如下:

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

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

相关文章

深度解析百数多标签技术:让数据处理更加精准与高效

百数的多标签功能允许用户在单个表单或应用中创建多个独立的标签页&#xff0c;每个标签页可以包含不同的字段和数据。这有助于清晰组织和管理表单内容&#xff0c;使数据结构更加分明。用户可以根据需要添加、删除或重新排序标签&#xff0c;轻松管理复杂数据&#xff0c;提高…

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xf…

Kali系统的中英文切换

执行命令&#xff1a;sudo dpkg-reconfigure locales 命令作用&#xff1a;重新生成locales配置文件并允许你重新选择所需的语言环境。 中文&#xff1a;zh_CN.UTF-8 UTF-8 英文&#xff1a;en_US.UTF-8 UTF-8 用空格键选中和取消选项。 要设置成中文&#xff1a;取消选择en…

我教会了我妈搭建自己的 AI 聊天机器人...

在这个人工智能爆发的年代,ChatGPT、Claude、Kimi、文心一言等 AI 大模型产品火遍全网,仿佛一夜之间,人人都在谈论 AI。 作为普通人的我们,难道就只能看着程序员们尽情玩耍,自己却无法参与其中吗?NO! 鉴于最近自己社群学员和粉丝的要求&#xff0c;一进来大家无论是不是小白…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…

Centos+Jenkins+Maven+Git 将生成的JAR部署到Jenkins服务器上

背景:前一篇写的是Jenkins和项目应用服务器不在同一个服务器上。但是有的公司可能不会给Jenkins单独弄一个服务器。可能就会出现Jenkins就搭建在某一个应用服务器上。这种情况的参考如下的操作。 1、登录 没有安装的参考下面的安装步骤先安装: Jenkins安装手册 输入账号、…

PT100(RTD)是什么?2线,3线,4线原理

RTDs - or Resistance Temperature Detectors- (电阻式温度探测器)&#xff0c;是温度型传感器&#xff0c;包含一个电阻&#xff0c;这个阻值可以随温度的变化而变化。在工业的进程中和实验室里已经使用了很多年&#xff0c;以精确&#xff0c;可靠和稳定的特性。 2线制 2线制…

linux的常用系统维护命令

1.ps显示某个时间点的程序运行情况 -a &#xff1a;显示所有用户的进程 -u &#xff1a;显示用户名和启动时间 -x &#xff1a;显示 没有控制终端的进程 -e &#xff1a;显示所有进程&#xff0c;包括没有控制终端的进程 -l &#xff1a;长格式显示 -w &#xff1a;宽…

聊一聊 C# 弱引用 底层是怎么玩的

一&#xff1a;背景 1. 讲故事 最近在分析dump时&#xff0c;发现有程序的卡死和WeakReference有关&#xff0c;在以前只知道怎么用&#xff0c;但不清楚底层逻辑走向是什么样的&#xff0c;借着这个dump的契机来简单研究下。 二&#xff1a;弱引用的玩法 1. 一些基础概念 …

主播美颜工具开发全攻略:美颜SDK从基础到进阶的技术指南

今天&#xff0c;笔者将为你详细介绍美颜SDK的基础知识以及如何进行进阶开发。 一、美颜SDK基础知识 什么是美颜SDK&#xff1f; 美颜SDK是一种软件开发工具包&#xff0c;包含了一系列用于图像处理的算法和功能&#xff0c;主要用于实时视频处理和图像优化。开发者可以将美…

计算机基础——经典排序算法总结2

直接插入排序的过程&#xff1a;先将序列第一个记录暂时作为有序子序列&#xff0c;从第二个开始逐个进行插入&#xff0c;直至整个序列有序。一趟排序将elem[i]插入到已排好序elem[0…i-1]中各元素做比较后的任何对应位置&#xff0c;所以未必能选出一个元素放在其最终位置上。…

自定义 vant 的 van-calendar 日历控件

最近在做 vue 微信公众号项目&#xff0c; 有个自定义日历控件展示的需求&#xff0c;经过查阅资料&#xff0c;最终实现了如图所示效果&#xff0c;这里做了总结&#xff0c;需要的小伙伴可以参考一下&#xff1a; HTML代码&#xff1a; <template><div class"…

YOLOv10(7):YOLOv10训练(以训练VOC数据集为例)

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据_yolov10 训练-CSDN博客 YOLOv10&#xff08;2&#xff09;&#xff1a;网络结构及其检测模型代码部分阅读_yolov10网络结构图-CSDN博客 YOLOv10&#xff08;4&#xff09;&#xff1a;损失&…

每日一题——Python实现蓝桥杯1. 坤坤的破译任务(举一反三+思想解读+逐步优化)三千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度&#xff1a; 空间复杂度&#xff1a; 我要更强 时间复杂度分析…

Flutter循序渐进==>与基金mysql数据库交互

导言 债基基金的注意事项&#xff0c;别看收益不高&#xff0c;注意事项可真不少。最近买了CS一支基金&#xff0c;三周时间就亏掉两三个点&#xff08;水平全网最差、赎回费和管理费全网最高&#xff09;。就是冲着它的历史成绩去的&#xff0c;突然发现已经换了基金经理&…

向日葵API集成服务:三大优势助力企业搭建专属远控方案

为了方便企业用户更加灵活的搭建满足各自需求的软件解决方案&#xff0c;降低开发和部署门槛&#xff0c;很多软件方案供应商提供了多样化的合作模式。 以贝锐向日葵远程控制为例&#xff0c;他们就向客户提供了基础的SaaS服务模式、私有化部署模式、SDK嵌入模式&#xff0c;以…

第二证券:近300亿资金抄底,低估值+高增长“错杀”股名单来了,仅11只

成绩表现优质公司或存在“错杀”的状况。 头部宽基ETF成交额继续放量&#xff0c;近300亿资金抄底 6月21日&#xff0c;上证指数跌破3000点后&#xff0c;商场谨慎情绪延伸&#xff0c;成交量继续走低&#xff0c;本周4个交易日均缺乏7000亿元。 关于3000点以下的地量行情&a…

推荐系统中冷启动环节的设计实现

目录 推荐系统中冷启动环节的设计实现 推荐系统中冷启动环节的设计实现 唐楠烊 [IT阅读排行榜](javascript:void(0)&#x1f609; 2024-06-28 07:15 北京 推荐系统中的冷启动分为物料冷启动和用户冷启动。用户冷启动主要是针对新用户&#xff0c;但有时候也用于低活用户拉活。…

CVPR24已开源:刷新监督学习SOTA,无监督多目标跟踪时代来临!

论文标题&#xff1a; Matching Anything by Segmenting Anything 论文作者&#xff1a; Siyuan Li, Lei Ke, Martin Danelljan, Luigi Piccinelli, Mattia Segu, Luc Van Gool, Fisher Yu 导读&#xff1a; 在计算机视觉的征途中&#xff0c;多目标跟踪&#xff08;MOT&…

武汉凯迪正大—漆包圆线软化击穿试验仪 漆包线检测仪器

产品功能 武汉凯迪正大电气有限公司生产KDZD-JC软化击穿试验仪用于检测3.00mm及以下漆包线在热状态下漆膜软化后的绝缘性能&#xff0c;根据设定的预热温度、试验时间、仪器自动完成对试样的预加热、加负荷、加试验电压&#xff0c;达到试验时间或试样被击穿时即卸负荷&#x…