请问为什么代码2受字符长度限制,代码1输入却不受字符串长度限制,理论上讲字符串末尾有\0,只能输入一个字符呀?

代码1
#include<stdio.h>
int main()
{
char a[2],n;
scanf("%s",a);
printf("%s",a);
return 0;
}

代码2
#include<stdio.h>
int main()
{
char a[2],n;
for(n=0;n<=1;n++)
scanf("%c",&a[n]);
for(n=0;n<=1;n++)
printf("%c",a[n]);
return 0;
}

这就牵扯到scanf函数不安全的问题了
在VS编译器下,直接使用scanf函数是会报错的,原因就是因为当scanf("%s")输入的时候,并不会检查你的数组是否放得下这串字符串

  • 代码1定义了一个char arr[2]的数组,合法的字符串输入应该是1个字符加一个'\0',但是scanf在读取的时候并不会只读取一个或者两个就停止,而是来者不拒,直到非法访问,程序挂掉
  • 而代码2就是for循环输入两次字符了,这时候相当于char arr[2]={'a','b'};(当你这样定义字符数组的时候,尾部是不会添加'\0'的)而当for循环中的下标为2的时候,就会形成越界访问,程序报错

为了解决这个问题,微软在VS编译器下提供了一个更安全的版本scanf_s。在使用该函数的时候,你可以添加一个输入限制数,以防止产生越界访问的情况

img

参考这篇博客👉https://blog.csdn.net/qq_43309823/article/details/95386759?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164389954716780274167847%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164389954716780274167847&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-95386759.first_rank_v2_pc_rank_v29&utm_term=scanf_s&spm=1018.2226.3001.4449

如果对你有帮助,还请点个采纳,万分感谢!