1.'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.(此函数或变量可能不安全。考虑使用scanf_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。)
很经典的一个问题,上次学C的时候好像也遇到过。错误是因为 Microsoft Visual Studio 编译器(MSVC)将传统 C 库函数如 scanf 标记为不安全,并建议使用更安全的版本 scanf_s。这是微软特有的警告,目的是防止缓冲区溢出等安全问题。下面是我搜集到的2个解决方法。
方法 1:使用 scanf_s(仅限 Windows/MSVC)
#include <stdio.h>
int main(void) {
int dogs;
printf("How many dogs do you have?\n");
scanf_s("%d", &dogs)
printf("So you have %d dogs\n", dogs);
return 0;
}
缺点:scanf_s 是微软扩展的函数,不是标准 C 函数,在其他编译器(如 GCC、Clang)中无法编译。
方法 2:禁用安全警告
#define _CRT_SECURE_NO_WARNINGS // 必须放在第一行!
#include <stdio.h>
int main(void) {
// 原有代码
}
优点:兼容所有标准 C 编译器(如 GCC、Clang),适合跨平台学习。PS:CRT=C Runtime Library(C 运行时库)
或者可以点击VS的项目菜单栏—>属性—>C/C++—>预处理器—>预处理器定义中,点击编辑添加_CRT_SECURE_NO_WARNINGS
2.unsigned和unsigned long为什么字节长度都是4
unsigned实际上是unsigned int的缩写,它与unsigned long是两种不同数据类型,即使他们大的长度相同,但用这两个函数分别定义一个数,例如:
unsigned int a=10;
unsigned long b=20;
a=b;//这样写会报错
实际上,它们俩的长度根据编译器/系统的不同,会发生变化
我们可以使用代码输出他们的字节长度。结果都是4。
#include<stdio.h>
int main(void){
printf("unsigned int 大小:%zu 字节\n", sizeof(unsigned int));
printf("unsigned long 大小:%zu 字节\n", sizeof(unsigned long));
return 0;}
注意,这里的占位符用的是%zu,它是专门用于输出size_t类型的无符号整数,size_t 是标准库中表示“大小”的类型(如 sizeof 运算符的返回值)。%zu的大小取决于操作系统,在32位系统中是4字节,64位系统中是8字节。%d是用于输出int类型的参数,如果在此处使用,虽然可以正常运行,但是编译器会发出警告。
其他的一些占位符后面我会整理下再发一篇。