c字符串连接无论您使用什么编程语言,当您开始构建真实世界的应用程序时,您将不可避免地结束文本处理。A lot of modern languages have built-in facilities for dealing with text data (commonly known as “strings”), but when you’re working with the C language, you have to go through a few more steps and do a little more memory management in order to handle strings properly. (需要进修c?遵循初学者教程。)不过,这并不难。你只需要关注你正在做的事情。

任何语言中最常见的字符串操作之一是连接的行为。这意味着能够将一个字符串的内容添加到另一个字符串的末尾。有无数的实际应用程序,但能够逐步积累一串文本的基本概念是非常有价值的,无论您是如何编写基本控制台应用程序还是全面的GUI。

概述

我们将首先概述CLINGS如何在C中工作。语言本身对字符串的支持非常有限;它主要允许您在代码中指定文本数据,并依赖于库函数来对其执行操作。

这些字符串以普通字符阵列的形式出现 - 即邻接的字符序列。然后,这些字符序列由“空值”字符(其ASCII值为零的字符),这是指将其指定为与随机字符块相对的字符串。此终结器告诉程序员文本的字符串结束,因此循环应停止处理的情况下,因为文本数据可以非常长。

在代码中,在双引号(如此)内括起任何内容(“如此”)导致C字符串表达式 - 一个字符数组,后跟空终止器。拿这个经典榜样:

“你好,世界!”

C中的此表达式导致指向包含上述文本消息的字符数组的指针,其由所有13个单个字符组成,然后是隐式空终止器。由于表达式返回到第一个字符的指针,因此可以存储此消息的内存位置,如下所示:

char * mymessage =“你好,世界!”;

如果您如上所述声明,则字符串的内容将是只读的。任何写入它的尝试都可能导致不确定的行为。或者更糟糕的是,您的计划可能会崩溃。由于我们使用字符串连接的目标是将两个或更多个字符串组合在一起,我们希望能够自由地写入我们的字符串。相反,我们声明它是如此:

char mymessage [] =“你好,世界!”;

这样,字符串的内容就可以写了。在本例中,“myMessage”的类型是固定长度为14(13个字符加上NULL结束符)的字符数组,而不是像上面另一个例子中那样指向字符的指针。

请注意,一旦以这种方式声明字符串,就可以稍后将指针分配给其内存位置,并且仍然使用指针操作写入它 - 这是因为指针指向内存中的可写位置。之前,我们只是告诉C要分配指向固定的数据集的指针。使用阵列声明,我们会告诉C在堆栈上为我们的字符串分配一些空间。

通过所有建立的,我们如何将两个或更多字符串结合在一起?另一个非常重要的问题是关于内存空间 - 由于上面的阵列声明来调用固定长度,我们如何结合字符串而不脱离界限?

Strcat函数

为了回答越界问题,我们需要知道如何声明一个指定特定长度的数组,而不是让C为我们计数字符。

char mymessage [256] =“你好,世界!”;

在这个声明中,我们在内存中正好分配256个字符的空间,它的开头包含经典短语的13个字符,加上第14个位置的NULL结束符。有了NULL终止符之后的额外空间,我们就有空间添加更多的数据。幸运的是,在C标准库中有一个函数专门处理字符串组合。首先,确保在源文件的顶部#include适当的头文件:

#include 

String.h标题包含我们需要的函数加上许多其他相关函数。但是,我们专注于的是“Strcat”函数,它在标准库中定义了:

Char *strcat(Char *dst, Char *src);

在这里,我们可以看到strcat是一个函数,它既接受指向源字符串的指针,也接受指向目标字符串的指针,并返回指向最终组合字符串的指针。请注意,因为我们可能将一个或多个源字符串组合到同一个目标中,所以不需要使用strcat函数的返回值。但是,如果您确实需要它,您可以简单地将其结果赋给字符指针。

现在让我们说我们有两个单独的邮件我们想要放在一起,声明如此:

char firstmessage [256] =“快速棕色狐狸”;char secondmessage [] =“跳过懒狗”。

请注意,我们在FirstMessage中宣布了额外的空间。虽然我们在这种情况下不需要多达256个字符,但仍然是良好的做法,可以分配比你需要的空间更多的空间,以便您有一些“呼吸室”,以防您想要连接更多字符串。

现在让我们把它们融合在一起!

strcat (firstMessage secondMessage);

那不是那么糟糕。让我们看看它是否有效:

printf(“%s \ n”,firstmessage);

我们应该在控制台输出中看到以下内容:

敏捷的棕色狐狸跳过了懒狗。

成功!但是等一下……因为我们知道在第一个消息的结尾有一个NULL终止符,而NULL终止符标记了字符串结束的位置,为什么输出不是简单的“快速的棕色狐狸”?

这是由于strcat函数的魔力。这个函数是专门为处理以NULL结束的字符串而设计的,它考虑到多个字符串都有自己的NULL终止符这一事实。因此,当它放入一个新的源字符串时,它会自动地从目标中删除NULL终止符。多方便啊!

安全

但是有一个问题。当程序员正常完成一切时,Strcat函数很大,但是当您在项目上有多个人时会发生什么,有人错误地决定做这样的事情:

char msg1[] = "测试,测试,";Char msg2[] = " 1, 2, 3…";strcat (msg1 msg2);

乍一看,你可能不会注意到有什么问题。但是请注意我们为msg1分配了多少空间。因为C是为我们计算的,所以我们将在内存中总共得到19个字符(包括NULL结束符)。但是合并后的消息会更大一些!

这是C语言中一个非常常见问题的简单示例:缓冲区溢出。在现代计算机上,这将在最坏的情况下导致崩溃。但是在不太安全的系统上,这可能导致覆盖不属于您的应用程序的内存!这是非常糟糕的,事实上,这也是过去许多安全漏洞起作用的原因。

意识到这是一个真正的问题,标准委员会向C标准图书馆添加了更新的职能:

Char *strncat(Char *dst, const Char *src, size_t count);

strncat函数与strcat完全相同的方式,除了要复制的字符数量的额外参数。虽然这仍然不会阻止程序员在错误的值为“count”的错误值中,但它仍然可以在防止意外缓冲区溢出中进行很长的路要走。它保证它永远不会从源到目标中的字符数量。这些日子没有太大的原因使用STRNCAT上的常规Strcat函数,但当然它仍然有用在教授C的串联级联如何工作。

结束思想

一旦你开始用C编写真实世界的应用程序,你很快就会发现像字符串连接这样的东西是极其重要的。不幸的是,它不像在高级语言中那样简单地说“废话”+“废话”,但与此同时,你确实可以更多地控制如何使用你的内存。没有魔法或神秘;每个字节都有解释。一旦你有了坚实的C语言基础,你就可以开始向C的哥哥和开始获得有价值的C ++技能的过程。c++中的字符串也更好!

在C中有很多与字符串相关的功能有用。字符串连接是一个大的,但它绝对不是唯一的一个。您可以自己了解更多信息,或者您可以在Udemy完成一些更有挑战性的C问题一旦你对语言更舒服。无论您选择哪种路线,最重要的是你很开心!

c#顶级课程

用于初学者的#.NET
里克•菲利普斯
4.4 (1263)
完成C#Unity Game Developer 3D
Ben Tristem,Rick Davidson,Gamev.TV团队
4.7 (26,828)
畅销书
c#中级:类,接口和面向对象
Mosh Hamedani.
4.6 (23135)
畅销书
RPG核心战斗创造者:学习中级Unity c#编码
Ben Tristem,Rick Davidson,Sam Pattuzzi,Gamev.TV团队
4.7 (8490)
C#高级主题:准备技术访谈
Mosh Hamedani.
4.5 (15,119)
完整的c#大师级
Denis Panjuta,Tutorials.eu by Denis Panjuta
4.5 (12,024)
C#和.NET中的设计模式
Dmitri Nesteruk.
4.4 (7102)
畅销书
c#开发人员:使用Visual Studio使你的编码速度翻倍
Mosh Hamedani.
4.5 (2,647)
畅销书
使用C#和.NET学习并行编程
Dmitri Nesteruk.
4.5 (2,035)
畅销书
Unity c#脚本:完成Unity游戏开发的c#betwayapp下载安装
Raja Biswas,Charger Games
4.5 (1,388)
畅销书

更多C#课程

c#的学生也会学习

赋予你的团队。引领行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求演示