7.C语言之字符串操作函数

本文深入探讨了C语言中字符串函数的使用与实现,包括strcpy、strncpy、strlen及strcmp等核心函数,并提供了代码示例。

在这一节,我想主要来介绍一下C语言操作字符串的常用函数。

C语言的字符串函数的原型都驻留在<string.h>头文件中,因此我们在处理字符串时,需要引入这个头文件。

但是,我不希望只是单纯地介绍每个函数的用法,如果那样,看API就可以了,我希望在介绍每个函数时都自己来实现一次。

1. strcpy函数

string copy,我们先来看一下该函数的用法。

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

int main()
{
    char *str1="abcd";
    char str2[5];   
    strcpy(str2,str1);
    printf("%s",str2);
    return 0;
}

在上段代码中,我们注意,str2的字符串长度应该是5,也就是strlen(“abcd”)加上’\0’。在上面的代码中,我们将str1的字符串复制到了str2中。

我们也来看下,这两段代码的区别:

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

int main()
{
    char str1[5]="abcd";
    char str2[5];   
    char *str3=str1;
    strcpy(str2,str1);
    str1[1]='t';
    printf("str2:%s\n",str2);
    printf("str3:%s",str3);
    return 0;
}

我们对比结果可以发现他们的不同,在这里,我们不妨回头想想Java/C#的深复制和浅复制。

当我们修改第一段代码为这样时会发现错误:

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

int main()
{
    char str1[5]="abcd";
    char str2[3];   
    strcpy(str2,str1);
    str1[1]='t';
    printf("str2:%s\n",str2);
    return 0;
}

错误的原因就是,str2不足以容纳下str1的字符串,也就是说strcpy我们没有足够的控制权,那么我们就可以来采用strncpy的方法来实现:

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

int main()
{
    char str1[5]="abcd";
    char str2[3];   
    strncpy(str2,str1,sizeof(str2)-1);
    str2[sizeof(str2)-1]='\0';
    printf("str2:%s\n",str2);
    return 0;
}

这个方法就不多说了,就是加上了一个长度控制,接下来我们来试着实现一下简单的strcpy函数。

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


char *mycopy(char *,const char *);
int main()
{
    char str1[5]="abcd";
    char str2[5];   
    mycopy(str2,str1);
    printf("%s",str2);
    return 0;
}

char *mycopy(char *strDest,const char *strSource)
{
    char *temp=strDest;
    while(*temp++=*strSource++)
        ;
    return strDest;
}

同理,我们也可以写出strncpy的代码:

char *mycopy(char *strDest,const char *strSource,int size)
{
    char *temp=strDest;
    int i =0;
    while(i<size)
    {
        *temp++=*strSource++;
        i++;
    }
    *temp='\0';
    return strDest;
}

2. 再谈字符串的问题

其实我之前一直都没有想懂关于字符串中修改某一字符的问题,我一直很困扰这样一个问题:

我收回在上一节中说的观点,其实字符串是否能修改取决的是这段字符串是否位于常量区

3. strlen函数

这个很简单,实现一下:

size_t mylength(char * str)
{
    int count=0;
    while(*str++)
    {
        count++;
    }
    return (size_t)count;
}

但是如果这样来写,每次当指针前移的时候,都需要进行一次加法操作,会对效率造成一定的影响,我们可以这样来写:

size_t mylength(char * str)
{
    char *temp=str;
    while(*temp++)
        ;
    return (size_t)(temp-str-1);
}

4. strcmp函数

字符串比较函数:

int mycompare(const char *str1,const char *str2)
{
    while(*str1==*str2)
    {
        if(*str1=='\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    return *str1>*str2?1:-1;
}

 

本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范表达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴表达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值