【问题标题】:print and scan a string c打印并扫描字符串 c
【发布时间】:2015-06-20 04:36:56
【问题描述】:

我想使用 Visual Studio 在 C 中扫描和打印一个字符串。

#include <stdio.h>

main() {
    char name[20];
    printf("Name: ");
    scanf_s("%s", name);
    printf("%s", name);
}

完成此操作后,它不会打印名称。 会是什么?

【问题讨论】:

  • 您是否在命令提示符处输入名称?...通过查看代码,一切似乎都很好
  • 是的,如果我输入我的名字,它不会输出任何内容。
  • Visual Studio 是否对scanf_s("%s", name); 发出警告?你用的是什么版本?
  • 我已经修复了它:scanf_s("%s", name, sizeof(name));

标签: c string char printf


【解决方案1】:

引用the documentation of scanf_s

备注:

[...]

scanfwscanf 不同,scanf_swscanf_s 需要为cCsS 或字符串类型的所有输入参数指定缓冲区大小包含在[] 中的控制集。以字符为单位的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。

所以,scanf_s

scanf_s("%s", &name);

是错误的,因为您没有传递表示缓冲区大小的第三个参数。此外,&amp;name 的计算结果为 char(*)[20] 类型的指针,这与 scanf_s 中预期的 %s 不同(char*)。

通过使用sizeof_countof 并使用name 而不是&amp;name 来表示缓冲区大小的第三个参数来解决问题:

scanf_s("%s", name, sizeof(name));

scanf_s("%s", name, _countof(name));

name 是数组的名称,数组的名称“衰减”到指向其第一个元素的指针,该元素的类型为 char*,这正是 scanf_s 中的 %s 所期望的。

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多