今天实验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();
}
不知道你这个问题是否已经解决, 如果还没有解决的话:#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小结:
不安全函数,全靠编程者自己注意。这种函数平常练习为了方便用用,真正写代码的时候还是不要用这种函数,东西多了脑子可能就忽视了。