引用文献scanf_s,
备注:
[...]
不像
scanf和wscanf,scanf_s并wscanf_s需要类型的所有输入参数中指定的缓冲区大小c,C,s,S其被包围在或字符串控制集合[].字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后.
所以 scanf_s
scanf_s("%s", &name);
Run Code Online (Sandbox Code Playgroud)
是错误的,因为你没有传递表示缓冲区大小的第三个参数.另外,&name计算一个类型的指针,char(*)[20]该指针%s与scanf_sexpected(char*)中的指针不同.
通过使用第三个参数表示的缓冲器的大小使用固定的问题sizeof或_countof并用name的替代&name:
scanf_s("%s", name, sizeof(name));
Run Code Online (Sandbox Code Playgroud)
要么
scanf_s("%s", name, _countof(name));
Run Code Online (Sandbox Code Playgroud)
name是一个数组,数组的名称的名称为"衰减"的指针到它的第一元件,其类型的char*,正是%s在scanf_s预期.