c语言 strcat 函数问题

今天实验strcat函数的时候老出现一个问题显示:用于调用的参数太少(本人使用的是VS2017)
自己自行百度看到有这种写法却可以编译通过,求解。

#include <stdio.h>
#include <string.h>
int main(void)
{
    char d[] = "adiadjwijda"; 
    char *s = "aidwi";
    strcat_s(d,s);
    printf("%s", d);
    getchar();
}

strcat_s和strcat不同,它需要3个参数,第二个参数是缓冲区的大小,你这么写,d容纳不下拼接之后的字符串。
你可以写

#include <stdio.h>
#include <string.h>
int main(void)
{
    char d[100];
        char d1[] = "adiadjwijda"; 
        strcpy_s(d, 100, d1);
    char *s = "aidwi";
    strcat_s(d, 100, s);
    printf("%s", d);
    getchar();
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/717234
  • 你也可以参考下这篇文章:c语言实现strcat函数
  • 同时,你还可以查看手册:c语言-strcat() 中的内容
  • 除此之外, 这篇博客: C字符串操作strcat/strcat_s详解中的 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小结:

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

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^