一、scanf在vs中会出现以下错误提示:
不安全的原因是scanf不会进行边界检查,输入的数据可能溢出到其它内存中。VS建议我们用scanf_s替代,带_s的后缀的函数是为了让原版函数更安全。scanf_s还需要提供一个参数,表明最多读取多少个字符。精确的讲,最多读取n-1个字符,因为c语言中c字符串结尾存储一个0(一个字符),即“字符串结束符”。
scanf_s,same as scanf,except that %c,%s and %conversion specifier each expect two arguments(the usual pointer and a value of type rsize_t indicating the size of the receiving array,which may be 1 when reading with a %c into a single char).(引自https://en.cppreference.com)
以下为conversion 和specifiers的翻译结果,遇到不会的英文单词就学会。
scanf_s的使用示例:
二、fflush(stdin)在VS中不起作用的解决办法:
我们用scanf_s读取数据时,如果中间没有空白字符(scanf是从第一个非空白字符开始读,读到出现空白字符为止),会读到回车符的前一个字符,所以scanf_s读完后,输入缓冲区会留下一个回车符,这样如果后面继续用scanf没问题,但如果用getline()函数便会出现问题,因为getline()函数是读一行,读到回车符就停止,所以如果写下面这个程序,便会导致第二次无法输入,因为输入缓冲区有数据(\n),正好让getline()读到并结束了读取。
导致的结果是我们无法输入第二个字符串:
所以我们应该在scanf之后清空输入缓冲区:
fflush(stdin)在VS中无效!
我们用下面这两行可以代替fflush(stdin),达到清除那个回车符的效果:
int c;
while((c=getchar())!='\n'&&c!=EOF);
我们来看看getchar这个函数,简单的理解就是getchar从stdin读取下一个字符,如果成功了就返回独到的字符,失败了就返回EOF。不出意外的话,这个回车符就可以被getchar()读走,这里while循环实际上在循环里没有任何操作,起到的作用是:如果没有读到那个回车符,并且也没有发生读取失败,就让程序一直卡在这个空的循环里。
其中,while一句用 while(getchar()!='\n');也可。
简单的情况下,我们甚至直接用getchar()也能达到目的。
参考资料: