解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错:scanf_s函数报错:没有为格式字符串传递足够的参数

int main() {
	char s1[20] = "i m name";

	char *p1, *p2;
	char s3[10] = {0};

	p1 = s1;
	p2 = s3;
	printf("请输入你的名字: \n");
    scanf_s("%s",&s3);

	printf("%s\n", s3);

	for (; *p1 != '\0'; p1++) {
		if (*p1 == *p2) {
			p2 = s3;
		}
		printf("I am %s\n", s3);
	}

	while (true){}
  return 0;
}

这个问题很变态

解决办法:在使用%c和%s读入字符或字符串时,应在地址参数后附加一个缓冲区边界值。 

int main() {
	char s1[20] = "i m name";

	char *p1, *p2;
	char s3[10] = {0};

	p1 = s1;
	p2 = s3;
	printf("请输入你的名字: \n");
    //scanf_s("%s",&s3);
	scanf_s("%s",&s3,sizeof(s3));   //使用sizeof

	printf("%s\n", s3);

	for (; *p1 != '\0'; p1++) {
		if (*p1 == *p2) {
			p2 = s3;
		}
		printf("I am %s\n", s3);
	}

	while (true){}
  return 0;
}

总结;就会提示你没有为格式字符串传递足够的参数。
首先我们来看一下scanf和scanf_s的区别
scanf()不会检查输入边界,可能造成数据溢出。
scanf_s()会进行边界检查。
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。

 

 

上面的程序有点复杂;下面来一个简单点的例子:

int main(void) {
	char str1[30] = { 0 };
	char str2[30] = { 0 };
	char str3[30] = { 0 };
	//gets() 用法
	printf("Input a string: ");
	gets_s(str1);
	//scanf() 用法
	printf("Input a string: ");
	scanf_s("%s", str2);
	scanf_s("%s", str3);

	printf("\nstr1: %s\n", str1);
	printf("str2: %s\n", str2);
	printf("str3: %s\n", str3);
	while (true){}
	return 0;
}

上面的代码当你输入字符串的时候会报错:没有为格式字符串传递足够的参数

解决scanf_s函数报错:没有为格式字符串传递足够的参数_第1张图片

解决办法:在使用%c和%s读入字符或字符串时,应在地址参数后附加一个缓冲区边界值。 

解决scanf_s函数报错:没有为格式字符串传递足够的参数_第2张图片

你可能感兴趣的:(C语言,c语言)