VS2013软件下的printf输出问题

ALEXDDY 2017-11-03 01:54:58
//praise1.c -- 使用不同类型的字符串
#include<stdio.h>
#include<stdlib.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[40];

printf("What's your name? ");
scanf_s("%s", name);
printf("Hello, %s. %s\n", name, PRAISE);

system("pause");
return 0;
}

运行后程序为
What's your name? alex
Hello, . You are an extraordinary being.


你好,请问一下这段程序的输出为什么不是

What's your name? alex
Hello, alex, You are an extraordinary being.
...全文
541 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2017-11-04
  • 打赏
  • 举报
回复
改成scanf_s("%s", name, 40); 或者 scanf("%s", name); scanf_s还需要一个参数用于确认缓冲区大小
小灸舞 版主 2017-11-03
  • 打赏
  • 举报
回复
作者:benpigchu 链接:https://www.zhihu.com/question/53311855/answer/134429152 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 scanf_s 和 scanf 几乎是一样的,但是 scanf_s 在字符串的读入上有不同,允许在参数中指定读入字符串的长度上限,以避免读入的内容长度超过已有的内存空间的长度。比如,如果我们这样写:
char word[10];
scanf("%s",word);
然后运行的时候输入了一个这样的字符串:tooyoungtoosimplesometimesnaive 那么这么长的字符串就会全部填在 word 数组里,超过它的长度,这样会出偏差的。为了避免出现这样的偏差,scanf_s 允许你指定读入串的长度上限,于是我们改成下面这样:
scanf_s("%s",word,(rsize_t)sizeof word);
这样输入过长时就会产生错误,执行你之前在 set_constraint_handler_s 中定义的错误处理函数(如果你没有定义的话,系统会给你准备一个,也许是直接忽略,也许是直接停止运行),你的程序就不会在这里搞出什么偏差。而且,如果你传入的参数有空指针的话,也会产生错误,执行你定义的错误处理函数。也就是说,使用 scanf_s 比使用 scanf 要更安全。不过,并不是所有的标准库都实现了 scanf_s,你可以通过检测 __STDC_LIB_EXT1__ 是否被 #define 了,检测标准库是否支持,然后在代码最前面加上下面这一行:#define __STDC_WANT_LIB_EXT1__ 1 来开启标准库对于 scanf_s 以及其他一些函数的更安全的版本(比如 strcpy_s memset_s 之类的)的支持。这是 C11 新增的内容。
自信男孩 2017-11-03
  • 打赏
  • 举报
回复
scanf_s("%s", name, 40);
scanf_s使用时缺少参数,详细的请查阅一下scanf_s的原型

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧