今日在输入一个程序时一直改不过来,发现有错误,就是现在下图的情况:
明明已创造了可放入char元素的数组,但是在如图所示的scanf_s一行中,使用%s却无法使程序跑动起来,达不到想要的预期效果。
但是最让人疑惑的是明明该放入%c或者是%s,在放入%d后,程序居然运转了....它居然运转起来了...然后放入%c也可以,为何%s就不可以呢?(学c,从入门到入土)
最后在和别人的讨论(主要是别人教我)后,从历史开始讲起...
scanf是在scanf_s之前出现的,从前用scanf输入函数,现在是用scanf_s来输入函数,以此来避免不检查边界从而导致内存泄露然后程序崩掉。而在scanf_s中,平时输入%d %f %lf都没有问题,但在用%s和%c输入字符串或者字符时会进入缓冲区一个一个读取,这时候在scanf_s中就要定义一个缓冲区的边界值,用来防止内存泄露,这个时候有scanf_s的程序才会运行,所以在scanf_s那一行里要用scanf_s("%20s",password,sizeof(password));来做到定义边界值,从而使得有scanf_s的程序运行起来。
"20s"——定义输入20个字符
sizeof(password)——定义一个缓冲边界值,防止内存泄露。
总结来说,要解决上面的问题,有以下两种方法:
一、将scanf_s改为scanf。
二、将scanf_s一行改为输入scanf_s("%20s",password,sizeof(password));
但仍存在两点疑惑未解决:
一、为何在使用%c时不需要定义边界值?
二、为何在scanf_s一行里使用%d时程序可正常运行?
在以后可以尝试用指针方法来求解,路漫漫~~
上文里还有很多不准确的地方,如果有什么错误或者有大佬能够解答我的疑惑,欢迎大家来讨论。