解决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;
}

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

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

  • 103
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: 这个错误提示是因为在使用scanf_s函数时,格式字符串中需要传递参数数量不足。可能是因为格式字符串中包含了多个占位符,但是在函数调用时没有传递足够参数。需要检查一下格式字符串传递参数数量是否匹配。 ### 回答2: scanf_s是C语言的一个输入函数,用于读取用户从标准输入设备(键盘)输入的数据,并把它们存储到变量中。格式字符串scanf_s函数中的一个参数,用于指定输入数据的格式,如整型、字符型、字符串型、浮点型等等。 当scanf_s函数在执行时出现“没有格式字符串传递足够参数”这个错误时,通常是由于格式字符串中指定的变量与实际参数传递的变量类型不匹配,或者格式字符串中缺少了某些必要的变量参数。 例如,如果格式字符串中包含"%d"而实际参数没有提供整型变量来接收输入数据,就会出现以上错误。同样地,如果格式字符串中包含"%s"而实际参数没有提供字符串变量来接收输入数据,也会导致该错误的出现。 此外,还可能会出现格式字符串中包含的某些特殊字符与实际输入数据不匹配的情况,例如"\n"、"\t"等。这些特殊字符是控制字符,用于控制输入、输出的格式和位置,如果格式字符串中缺少相应的控制字符,就会出现错误。 为了避免出现该错误,我们可以通过仔细检查格式字符串和实际参数的变量类型,确保它们一一对应;或者使用更加安全和灵活的输入函数,如fgets()等,在读取输入数据时不会出现该错误。 ### 回答3: scanf_s是一个用于输入的C语言函数,其目的是从标准输入流中读取数据并根据给定的格式将它们转换为指定的类型。但是,在使用scanf_s函数时,很容易遇到错误:scanf_s没有格式字符串传递足够参数。如果您遇到这个错误,那么下面是一些解释和建议。 这个错误消息的意思是:格式字符串中包含的格式说明符的数量超过了传递函数的实际参数数量。例如,如果格式字符串中包含两个%s说明符,但是scanf_s函数只提供了一个字符串参数,则会出现该错误。这可能是因为您的代码中没有正确传递参数,或者您的格式字符串错误地指定了参数的数量或顺序。 解决此问题的最简单方法是检查格式字符串中的格式说明符和您传递函数参数数量和类型是否匹配。必须确保每个格式说明符都有一个相应的参数。另外,请确保这些参数的类型与格式说明符相同,例如,如果格式说明符是%d,则参数应该是int类型。 更好的方法是使用scanf_s的安全版本,并传递每个参数的最大长度,以便保护输入缓冲区免受缓冲区溢出攻击。这样做可以提高代码的安全性和鲁棒性。 最后,您可以通过使用调试器来检查代码中的错误和标识格式字符串参数之间的不匹配。调试器可以帮助您跟踪程序执行的每个步骤,并在遇到错误时停止程序,以便您可以检查代码中的错误。 总之,当您遇到scanf_s没有格式字符串传递足够参数时,应该仔细检查格式字符串传递函数参数数量和类型是否正确匹配。使用安全版本的scanf_s和调试器也可以帮助您识别和纠正这些错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值