二、C语言数据类型与变量(scanf和printf (1))
二、C语言数据类型与变量(scanf和printf (3))
二、C语言数据类型与变量(scanf和printf (4)完)
给变量输入值
比如我们需要输入成绩
scanf()同样可以用到占位符,多了一个取地址符&,具体用法见如下的代码
在该代码中发出了一个警告,用scanf_s更为安全,这是VS特有的,VS认为scanf()不安全,但是使用scanf_s会使代码失去可移植性
被VS认为 不安全的函数还有strcpy, strcat
先按scanf_s运行该代码,解决方案在下面
在输入成绩100后继续按Enter即可继续运行代码
#include
int main ()
{
int score = 0;//变量初始化,可以不初始化,不会报错,但是最好做这一步
printf("请输入成绩:\n");
//提醒用户输入值,也可以不写这一步,直接输入
scanf_s("%d",&score);
//&为取地址符,意思是我们输入的值是为score这个变量赋值
//在这一步,变量score的值已经改变为输入的值
printf("成绩=%d\n",score);//为了验证,我们可以打印score的值
return 0;
}
输出结果
请输入成绩:
100
成绩=100
#define _CRT_SECURE_NO_WARNINGS 1
1.找到VS安装路径下的newc++file.cpp文件,修改newc++file.cpp该文件的内容,该文件本来为空,在该文件中添加这一行代码,以后新创建的每一个新的.c文件都会有这句代码
2.如果有读取权限限制,不能修改,把这个文件移到桌面再修改
复制到桌面,修改后再粘贴到原位置,这样操作后新建的 项自带这一句代码
scanf不会检测输入的长度和空间,判断目的空间是否能放得下,如果输入出错,那程序即会报错,比如输入一个5个元素的数组,但是你实际输入了7个,scanf不会提醒用户出错,会把7位全部存入数组,导致程序崩溃
让我们来看看此时scanf()和scanf_s()的区别
#include
int main()
{
char arr[5] = { 0 };//初始化数组,数组只有五个元素
scanf("%s", arr);//数组名本来就是地址,无需取地址
printf("%s\n", arr);
return 0;
}
`scanf_s()` 函数是 `scanf()` 函数的一个更安全的变体,常用于 Microsoft 的 Visual C++ 环境中。与 `scanf()` 相比,`scanf_s()` 要求为某些接收输入的参数额外提供一个大小参数,这是为了避免缓冲区溢出,增强程序的安全性。
在使用 `scanf_s()` 时,对于所有指向字符数组(字符串)的指针,你需要传递一个额外的参数,指定该数组的大小。例如,如果你想读取一个字符串到字符数组 `char str[50]` 中,你应该这样写:
char str[50];
scanf_s("%s", str, (unsigned)_countof(str));
在这个例子中,`_countof(str)` 是 Microsoft Visual C++ 中特有的宏,用来计算数组 `str` 的元素数量。如果你使用的是其他编译器或不确定 `_countof` 的可用性,可以直接使用数组的大小,如 `50`。
对于非字符数组的其它类型(如 `int`, `float` 等),使用 `scanf_s()` 时不需要提供额外的大小参数,与 `scanf()` 的用法相同。
1 scanf("%d", &i);
2 scanf("%d%d%d%d",&i,&a,&b,&c);