精华内容
下载资源
问答
  • 前面文章中介绍了关于字符串拼接函数 strcat ,而 strcat_s 函数strcat 函数一样,主要用于字符串拼接; strcat_s 是系统的安全函数,微软在 2005 后建议用一系统所谓安全的函数,这中间就有 strcat_s 取代了 ...

    目录

    零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

    一.strcat_s 函数简介

    前面文章中介绍了关于字符串拼接函数 strcat ,而 strcat_s 函数strcat 函数一样,主要用于字符串拼接;

    strcat_s 是系统的安全函数,微软在 2005 后建议用一系统所谓安全的函数,这中间就有 strcat_s 取代了 strcat ,原来 strcat 函数,没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串,容易产生程序崩溃。而strcat_s函数能很好的规避这个问题,strcat_s函数语法如下:

    /*
    *描述:此类函数是用于对字符串进行拼接, 将两个字符串连接再一起
    *
    *参数:
    *   [in] strSource:需要追加的字符串
    *   [in] numberOfElements:拼接后的字符串大小(并非目标字符串大小也并非原始字符串大小)
    *   [out] strDestination:目标字符串
    *
    *返回值:errno_t是微软新定义的一种类型,这种类型是一种整型,
    *       代表错误代码,若果是0 则代表没有错误,如果是其他的值 ,则会抛出一个值;
    */
    //头文件:string.h
    errno_t strcat_s(char *strDestination , size_t numberOfElements , const char *strSource );
    

    1.strcat_s 函数把 strSource 所指向的字符串追加到 strDestination 所指向的字符串的结尾,所以必须要保证 strDestination 有足够的内存空间来容纳 strSourcestrDestination 两个字符串,否则会导致溢出错误。

    strcat_s 函数原理:dst内存空间大小 = 目标字符串长度 + 原始字符串场地 + ‘\0’;

    2.strDestination 末尾的\0会被覆盖,strSource 末尾的\0会一起被复制过去,最终的字符串只有一个\0;

    二.strcat_s 函数原理

    strcat_s 函数原理:dst 内存空间大小 = 目标字符串长度 + 原始字符串场地 + ‘\0’;

    获取内存空间大小使用 sizeof 函数(获取内存空间大小)获取字符串长度使用 strlen 函数(查字符串长度)

    三.strcat_s 函数实战

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 strcat_s 函数
    //@Time:2021/06/05 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    #include "stdafx.h"
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include "windows.h"
    
    //error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    #pragma warning( disable : 4996)
    
    void main()
    {
        char src[1024] = { "C/C++教程-strcat_s函数" };
        char dst[1024] = { "www.codersrc.com" };
        //注意:strcat_s第二个参数的计算,该参数是拼接后的字符串大小,并非原字符串大小或者目标字符串大小
        int len = strlen(src) + strlen(dst) + 1;
        printf("strcat_s之前 dst:%s\n", dst); //
        strcat_s(dst, len, src);
        printf("strcat_s之后 dst:%s\n", dst);//
        system("pause");
    }
    输出结果:
    strcat_s之前 dst:www.codersrc.com
    strcat_s之后 dst:www.codersrc.comC/C++教程-strcat_s函数
    请按任意键继续. . .
    

    注意:strcat_s 第二个参数的计算,该参数是拼接后的字符串大小,并非原字符串大小或者目标字符串大小;

    四.猜你喜欢

    1. 安装 Visual Studio
    2. 安装 Visual Studio 插件 Visual Assist
    3. Visual Studio 2008 卸载
    4. Visual Studio 2003/2015 卸载
    5. 设置 Visual Studio 字体/背景/行号
    6. C 语言格式控制符/占位符
    7. C 语言逻辑运算符
    8. C 语言三目运算符
    9. C 语言逗号表达式
    10. C 语言自加自减运算符(++i / i++)
    11. C 语言 for 循环
    12. C 语言 break 和 continue
    13. C 语言 while 循环
    14. C 语言 do while 和 while 循环
    15. C 语言 switch 语句
    16. C 语言 goto 语句
    17. C 语言 char 字符串
    18. C 语言 strlen 函数
    19. C 语言 sizeof 函数
    20. C 语言 sizeof 和 strlen 函数区别
    21. C 语言 strcpy 函数
    22. C 语言 strcpy_s 函数
    23. C 语言 strcpy 和 strcpy_s 函数区别
    24. C 语言 memcpy 和 memcpy_s 区别
    25. C 语言 strcat 函数
    26. C 语言 strcat_s 函数

    未经允许不得转载:猿说编程 » C 语言 strcat_s 函数

    展开全文
  • 使用strcat_s函数的注意事项

    千次阅读 2018-12-15 15:14:18
    --------------------------------------------- -- 时间:2018-12-15 -- 创建人:Ruo_Xiao ...--------------------------------------------- ...一、strcat_s 1、原型: errno_t strcat_s( ...
    ---------------------------------------------
    -- 时间:2018-12-15
    -- 创建人:Ruo_Xiao
    -- 邮箱:xclsoftware@163.com
    ---------------------------------------------
    

    一、strcat_s

    1、原型:

    errno_t strcat_s(
                       char *strDestination,
                       size_t numberOfElements,
                       const char *strSource 
                    );
    

    2、功能:把strSource所指字符串添加到strDestination结尾处(覆盖strDestination结尾处的'\0')并添加'\0'numberOfElementsstrDestination的字符数组所占内存的空间大小。

    二、注意事项

    1、strSource字符数组的后面必须要有'\0'字符,否则该函数会一直拷贝strSource后面的字符,直至遇到'\0'

    2、numberOfElemets strDestinationbuffer的大小。该buffer必须足够大,满足能够存入strDestinationstrSource字符。

    三、源码分析(linux-4.13.11 / lib / string.c)

    char *strcat(char *dest, const char *src)
    {
    	char *tmp = dest;
    
    	while (*dest)
    		dest++;
    
    	while ((*dest++ = *src++) != '\0')
    		;
    	return tmp;
    }

    说明:

    char *tmp = dest;

    保存dest的地址,因为函数返回的是dest字符数组的首地址。

    while (*dest)
    		dest++;

    沿着dest向高地址遍历,直至找到'\0'字符(ASCII码为0),这段代码执行完成之后,*dest = '\0'
     

    while ((*dest++ = *src++) != '\0')
    		;

    src的字符数组中的元素依次赋值到dest后面的内存空间,直至*src= '\0',同时,dest='\0'*++的组合用法请看链接:https://blog.csdn.net/itworld123/article/details/79955932

     

    (SAW:Game Over!)

     

    展开全文
  • 用 <p>#include<stdio.h> <p>#include<string.h> <p>char str1[20]="one"...<p>strcat_s(str1,str2); <p>printf("%s\n",str1); 为何会显示str2未初始化?</p>
  • 这是两个处理字符比较安全的函数,不会报警,相对的与原来的函数相比有些不同 C++中sprintf_s的原型如下: int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );在...


    这是两个处理字符比较安全的函数,不会报警,相对的与原来的函数相比有些不同

    C++中sprintf_s的原型如下:

    int sprintf_s(
       char *buffer,
       size_t sizeOfBuffer,
       const char *format [,
       argument] ... 
    );
    http://msdn.microsoft.com/en-us/ce3zzk1k%28zh-cn%29.aspx#中,可以看到一个例子

    
    // crt_sprintf_s.c
    // This program uses sprintf_s to format various
    // data and place them in the string named buffer.
    //
    
    #include <stdio.h>
    
    int main( void )
    {
       char  buffer[200], s[] = "computer", c = 'l';
       int   i = 35, j;
       float fp = 1.7320534f;
    
       // Format and print various data: 
       j  = sprintf_s( buffer, 200,     "   String:    %s\n", s );
       j += sprintf_s( buffer + j, 200 - j, "   Character: %c\n", c );
       j += sprintf_s( buffer + j, 200 - j, "   Integer:   %d\n", i );
       j += sprintf_s( buffer + j, 200 - j, "   Real:      %f\n", fp );
    
       printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
    }
    
    Output:
       String:    computer
       Character: l
       Integer:   35
       Real:      1.732053
    
    character count = 79

    第一个是字符串指针的首地址,第二个参数是缓冲区大小,后面是格式化字符和对应的参数;

    而对于strcat_s函数,首先要确保连接的两个字符串都有内容,不然会报错,而且需要指出strcat_s函数的字符串缓冲区最大值,其原型如下:

    errno_t strcat_s(
       char *strDestination,
       size_t numberOfElements,
       const char *strSource 
    );
    strcat_s函数包含在<string.h>头文件中。

    展开全文
  • 先看下strcat()/strcat_s()函数调用报错: 放大一点 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To ...

    前言

         先看下strcat()/strcat_s()函数调用报错:

     放大一点

    严重性    代码    说明    项目    文件    行    禁止显示状态
    错误    C4996    'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    openGLES3.0Example_6_MapBuffers    D:\openGLESExercise\openGLES3.0Example_6_MapBuffers\MapBuffers.c    44    

     

    源码

    void PrintLogMessage(const char* msg)
    {
    	//GLint infoLen = GL_INFO_LOG_LENGTH;
    	GLint infoLen = 512;
    	char* infoLog = malloc(sizeof(char) * 512);
    	glGetProgramInfoLog(programObject, infoLen, &infoLen, infoLog);
    	GLint headLen = strlen("Invoke ");
    	strcpy_s(infoLog, headLen+1, "Invoke ");  //这里长度必须+1,要覆盖'\0',否则越界,vs2019边界检查更严格
    	/********* (1)src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
    	/*********(2)strcat返回值有什么作用? 链式传递:strcat(a, strcat(b, c));
    	/********* 最重要的是,strcat函数不检查这些。*********/
    	strcat(infoLog, "Invoke ");
    											  //strcat_s(infoLog, msg, strlen(msg)+1);
    	strcat_s(infoLog, strlen(msg) + 1, msg);
    	esLogMessage(" failed:Error message:%s\n", infoLog);
    
    	free(infoLog);
    }

    strcat、strcpy、strcmp、strlen是C中针对字符串的库函数,这四个老式函数不安全,然后C标准库针对这个情况整出strcat_s、strcpy_s、strncmp、strnlen_s(这个并不是替代stelen的)来弥补。而在C++中一般用string。

    下面主要讲:strcat()/strcat_s/strcpy()/strcpy_s()以及如何避免不安全的方法。

    下面是我拷贝的大神文章:在加上我的一点理解吧

    每天学一点!

    https://blog.csdn.net/songsong2017/article/details/90598068

    1 strcat
    1.1 函数功能
    把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'

    1.2  函数声明、参数及返回值
    头文件:

    #include<string.h>  (C)  、 #include<cstring>

    声明:

    char *strcat(char *dest, const char *src)

    参数:

    dest -- 指向目标字符串,该数组包含了一个 C 字符串,且足够容纳追加后的字符串
               src  -- 指向要追加的字符串,该字符串不会覆盖目标的字符串

    返回值:指向dest的指针

    1.3 注意
    (1)src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。最重要的是,strcat函数不检查这些。

    (2)strcat返回值有什么作用? 链式传递:strcat(a, strcat(b, c));

    1.4 strcat代码演示

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
     
     
    int main(){
        char str1[100] = "Hello,";
        char str2[] = "world";
        strcat(str1, str2);
        std::cout << "str1 is " << str1 << "str2 is " << str2 << std::endl;
         return 0;
    }


    显示结果:

    错误    1    error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 

    正如前言里说的,微软已经知道strcat等函数不安全了,直接不让你通过了,而解决措施也告诉我们了。但是这里为了先看看strcat,所以先不用strcat_s。

    如何忽略这个警告/错误,措施有以下几种:

    (1)第一种:_CRT_SECURE_NO_WARNINGS

    VS中:项目 - 属性 - 配置 - C/C++ - 预处理器 - 预处理器定义里添加:_CRT_SECURE_NO_WARNINGS

     

     (2)第二种: 加个预处理命令:#pragma warning(disable:4996)

        这里注意:#pragma warning(disable:4996)要放在#include "stdafx.h"后面!(具体可以百度stdafx的用法)

     

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
     
    #pragma warning(disable:4996)
     
    int main(){
        char str1[100] = "Hello,";
        char str2[] = "world";
        strcat(str1, str2);
        std::cout << "str1 is " << str1 << std::endl << "str2 is " << str2 << std::endl;
         return 0;
    }
     


     
    结果显示:
    str1 is Hello,world
    str2 is world
    请按任意键继续. . .
    PS:这里如果要用strcat,我还是倾向于第二种方法,因为第一种方法久而久之我们自己给忘了,而第二种方法从程序里就能显而易见,从而提醒自己这是个不安全的函数。

    前面也说,strcat函数有两个条件,dest的空间要能容纳src,且两者内存不能重叠。

    下面分别看下不满足上述两个条件,会发生什么。

    (1)dest空间不足

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
     
    #pragma warning(disable:4996)
     
    int main(){
        char str1[] = "Hello,";
        char str2[] = "world";
        strcat(str1, str2);
        std::cout << "str1 is " << str1 << std::endl << "str2 is " << str2 << std::endl;
         return 0;
    }


    从结果可以看出:当dest空间不足时,编译是可以通过的,但是在运行时出错。

     

    (2)dest和src内存重叠

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
     
     
    #pragma warning(disable:4996)
     
    int main(){
        char str1[100] = "Hello,";
        char *str2 = str1 + 2;
        strcat(str1, str2);
        std::cout << "str1 is " << str1 << std::endl << "str2 is " << str2 << std::endl;
         return 0;
    }


    结果:可以编译,但是无输出。

    strcat小结:

    不安全函数,全靠编程者自己注意。这种函数平常练习为了方便用用,真正写代码的时候还是不要用这种函数,东西多了脑子可能就忽视了。

    1.5 针对strcat解决措施
    (1)用strcat_s函数

    1 函数声明:(引用MSDN)

    errno_t strcat_s(char *strDestination, size_t numberOfElements, const char *strSource);

    2 参数及返回值

    参数:

    strDestination -- 目标字符串缓冲区
               numberOfElements -- 源字符串追加到目标字符串缓冲区后的总大小,单位字节

    //注意!!!strcat_s()第二个参数的大小是 src+des+1总和大小,+1是字符串结尾符:'\0'的大小

               strSource -- 源字符串缓冲区 

    返回值:

    0:成功

    EINVAL:目标字符串或者源字符串没有初始化

    ERANGE:越界

    3 注意

    strcat_s函数从上面可以看出,做了两个检查,字符串有没有初始化和越界。并没有针对内存重叠做出检查。

    第一个参数:合并字符串后的大小。即 源字符串大小 + 目标字符串的大小 + '\0'的大小 ,也就是

    numberOfElements = strlen(strDestination) + strlen(strSource) + 1;

    4 代码演示

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
     
     
    int main(){
        _CrtSetReportMode(_CRT_ERROR, 0);
        char str1[] = "Hello,";
        char str2[] = "world";
        int num = strlen(str1) + strlen(str2) + 1;
        errno_t rlt = strcat_s(str1, num, str2);
        if (rlt == 0)
            std::cout << "str1 is " << str1 << std::endl << "str2 is " << str2 << std::endl;
        if (rlt == EINVAL)
            std::cout << "no initialize" << std::endl;
        if (rlt == ERANGE)
            std::cout << "Dest's size is small!" << std::endl;
         return 0;
    }


    但是结果并不是:Dest's size is small!

    调试的时候,发现rlt=0,而MSDN上著名返回值为0即成功。

     

    这个地方我是真的百思不得其解啊!哪位大佬看到了这篇博客,有想法请一定告诉我! 谢谢!

    (2)用C++的string函数

    #include "stdafx.h"
    #include <iostream>
    #include <string>
     
     
    int main(){
        char str1[] = "Hello,";
        char str2[] = "world";
        std::string rlt = str1 + std::string("") + str2;
        std::cout << rlt << std::endl;
        return 0;
    }
     


     
    输出结果:
    Hello,world
    请按任意键继续. . .
    用C++中的string类简单粗暴。

    但是要注意以下几点

    (1)当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string。参考<<C++ Primer>>第5版,P81

    (2)string 怎么转 char* ?

    char *str = const_cast<char*>(rlt.c_str());
     

    程序运行结果

    工程源码下载

     

    展开全文
  • 使用strcat_s的注意事项

    万次阅读 多人点赞 2014-02-28 15:35:32
    我们要合并字符串的话,使用c语言编写... strcat_s函数声明: errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource ); 出现歧义的大部分为第2个参数。 1. L"Buffer is
  • strcat_s 和 strncat_s 使用

    千次阅读 2020-04-08 23:24:40
    所以新版的vs会提醒你换成更安全的函数strcat_s 和 strncat_s strcat_s:三个参数errno_t strcat_s(char * restrict dest,rsize_t destsz,const char * restrict src); 举例: char *a = "12345"; char *b =...
  • C++安全函数strcat_s

    万次阅读 2016-09-16 09:31:44
    C++安全函数strcat_s 1.必须包含的头文件: 2.函数申明: errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource );3.参数介绍 strDestination Null 终止的目标字符串...
  • errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource ); 2、函数功能 字符串拼接,追加 strSource 到 strDestination 3、参数介绍 strDestination:目标字符串缓冲区。 ...
  • 调查报告:整理并用实验比较分析strncpy、strcpy_s、 strncpy_s、strlcpy、strncat、strcat_s、 strncat_s、 strlcat等函数的异同 包含在头文件 string .h 中。 Strncpy: 函数原型:char *strncpy( char *dest, ...
  • 主要介绍了关于vs strcpy_s()strcat_s()用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • C++string函数strcat_s

    2015-05-04 15:12:00
    跟上一篇的strcpy_s一样,是新推出的较为安全的strcat函数 strcat_s脱胎于strcat,用于两个字符串的链接,strcat(str1,str2)直接返回新的str1. 但在vs2005后,为了安全起见,重新添加了些功能和api和以前不同。比如...
  • strcat_s详解

    万次阅读 2015-08-27 19:51:39
    strcat_s是为了解决字符串拼接溢出在VS2005之后引进的更具安全性的函数strcat_s本身保留了两个变量strcat的特性,即可以使用两个参数的函数原型。如stract_s(str1,str2);将str2拼接到str1后。 strcat_s新增三个...
  • strcat_sstrcat 的区别

    千次阅读 2019-11-07 16:49:16
    stract_s,strcpy_s,是VS2005及以后新增的具有更强"安全性"的CRT函数,取代了以前不带s函数。 以strcat为例,前后的比较: strcat:两个参数,第二个参数的字符串追加到后面可能会导致溢出。 strcat_s:可以三...
  • C字符串操作strcat/strcat_s详解

    万次阅读 多人点赞 2019-05-27 18:07:31
    strcat、strcpy、strcmp、strlen是C中针对字符串的库函数,这四个函数不安全,然后C针对这个情况整出strcat_s、strcpy_s、strncmp、strnlen_s(这个并不是替代stelen的)来弥补。而在C++中一般用string。 这篇文章...
  • strcpy_s、sptintf_sstrcat_s的使用

    千次阅读 2015-11-19 12:12:42
    strcpy_s、sptintf_sstrcat_s是strcpy、sptintf与strcat的安全版本,均是通过指定缓冲区长度来避免存在的溢出风险。 strcpy_s 与strcpy strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数,就象gets函数一样...
  • 1,计算字符串长度函数,不包括\0,注意它和sizeof()的不同,sizeof()计算数组长度,不但包括\0,而且是数组总长度,strnlen_s计算数组中字符的个数,不包括\0. strnlen_s(计算字符数组的首地址,计算字符数组的长度)...
  • strcpy_sstrcat_s的用法

    千次阅读 2014-03-26 16:49:28
    strcat_s的用法   strcpy_s是系统的安全函数,微软在2005后建议用一系统所谓安全的函数,这中 间就有strcpy_s取代了strcpy,原来strcpy函数,就象gets函数一样,它没有方法 来保证有效的缓冲区尺寸,所以...
  • C++笔记 strcat_sstrcat的区别

    千次阅读 2016-12-02 19:08:45
    strcat_s在C/C++中,用于连接两个字符串的标准库函数,是strcat函数的增强版本。 需包含的预编译头文件 编辑 1、在C语言中:#include 2、在C++语言中:#include (可配合使用 using namespace ...
  • strcpy_s()及strcat_s()的使用

    千次阅读 2019-09-30 16:37:51
    C语言中使用strcpy()来拷贝字符串,使用strcat()来连接字符串。其函数原型: char * strcpy ( char * destination, const char * source );...在C++中使用strcpy_s()和strcat_s(),其参数发生了变...
  • 我改成这样后,运行结果又出了问题,strcat_s(buffer, 100,areaNumber); 用的是VS2013 ``` #include #include void main() { char areaNumber[5]; char phoneNumber[12]; int input; char ...
  • 关于vs strcpy_s()strcat_s()用法

    千次阅读 2020-05-13 11:42:32
    大意说这个 strcpy()因为空间分配的 这个函数不安全 不建议用这个函数strcat()也是这样。当然错误c4996完全可以通过代码 让它不提示,但是它确实不安全 不如学习一下新函数的用法。 strcpy_s() 老的 strcpy...
  • 使用strcat_s进行字符串连接,代码如下: char TestEle[256] = "Lon"; strcat_s(TestEle, ":"); 使用VS2003进行编译时提示入戏错误: error C3861: “strcat_s”: 即使使用参数相关的查找,也未找到标识符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,942
精华内容 14,776
关键字:

strcat_s函数