1.scanf与scanf_s的区分
在新版本vs中,用scanf输入字符串,数字等会提示错误,这时应该输入scanf_s。
这是因为很多带“_s”后缀的函数可以让原版函数更安全,而scanf_s就是这样。比如:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[5]={'\0'};
scanf("%s", buf);
//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。
以上代码如果用scanf_s()则可避免此问题:
char buf[5]={'\0'};
scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0'
//如果输入1234567890,则buf只会接受前4个字符
注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.
2.scanf输入带空格字符串
scanf_s(scanf)此时视为相同。scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入。还有,如果想取一行字符(包含空格等)用scanf是可以的,但"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r、\n)就结束了,所以可以写成 "%[^\n]%*c",%[^\n]的作用就是读\n之外的所有字符,也就是说读到\n为止,%*c的作用就是把\n去掉,否则再次读的时候一直遇到的都是\n。(也可用gets()输入带空格字符串但一般不建议使用)
这篇文章,是我收集资料后总结的,算另类的翻译。