最详细的关于C6054:可能没有为字符串“name”添加字符串零终警告和C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”

项目场景:

博主在学习过程遇见几个头痛问题,因为当中涉及的几个知识点是还没接触,为了彻底搞懂每一条代码语句查阅很多资料才理解新知识点,并解决警告原因

因内容过多本篇文章主要介绍消除警告C6054:可能没有为字符串“name”添加字符串零终,消除警告C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”请移步:C6064


问题描述

// talkback.c -- 演示与用户交互
#include 
#include  // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main()
{
	float weight, volume;
	int size, letters;
	char name[40] ; // name是一个可容纳40个字符的数组
	printf("Hi! What's your first name?\n");
	scanf_s("%s", name, 40);
	printf("%s, what's your weight in pounds?\n", name);
	scanf_s("%f", &weight);
	size = sizeof name;
	letters = strlen(name) ;
	volume = weight / DENSITY;
	printf("Well, %s, your volume is %2.2f cubic feet.\n", name, volume);
	printf("Also, your first name has %d letters,\n", letters);
	printf("and we have %d bytes to store it.\n", size);
	return 0;
}

上面是代码,大家可以复制尝试,当我开始调试的时候,出现如下警告

最详细的关于C6054:可能没有为字符串“name”添加字符串零终警告和C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第1张图片


原因分析:

警告C6054:可能没有为字符串“name”添加字符串零终警告C6054:可能没有为字符串“name”添加字符串零终警告

最详细的关于C6054:可能没有为字符串“name”添加字符串零终警告和C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第2张图片

 我查了关于函数strlen相关内容,C语言 strlen ()函数用来求字符串的长度(包含多少个字符)。strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0

可能大伙会不理解\0又是啥东西,下面我解释:

 就是strlen()计算字符串长度,但是我们编写的代码都是由字符组成,那他怎么知道字符串结尾在哪里呢,所以就用到ASCLL码第0号(其实就是0)作为结尾

警告C6054是不会影响程序进行,但这是不安全的,但如果如果想消除警告方法如下


解决方案:

因为我指定strlen()函数计算的的是变量数组是字符串name,本篇提供方法有两个

方法一:将声明变量时将字符串name初始化定义为0,所以在定义字符串name后面直接加上结束结束符0, //char name[40] = {0};

方法二是在中间加字符串结束符'\0',“中间”是有一个范围,博主在网上没有找到这个范围的相关内容,但每个位置我都尝试了一遍,这个范围是从开始声明字符串变量----到使用strlen()函数,//name[ 40 - 1 ] = 0;

具体操作如下图

最详细的关于C6054:可能没有为字符串“name”添加字符串零终警告和C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第3张图片

 

 到此,问题已经解决,欢迎在评论区交流

你可能感兴趣的:(C语言,c#,c语言,c++,visual,studio)