【问题标题】:Issue with scan_s(), printl_s() and char in C with Visual Stuido使用 Visual Stuido 在 C 中的 scanf_s()、print_r() 和 char 问题
【发布时间】:2019-05-17 06:26:26
【问题描述】:

在 Visual Studio 2017 中,我在使用 scan_s()printl_s()char 编写简单的输入和输出应用程序时遇到问题。请查看 2 个应用程序,请帮助解释我使用 scan_s()printl_s()char 时出现的问题。

这段代码没问题:

#include <stdio.h>
int main() {
    char name[30];
    printf("Enter name: ");
    gets(name); // enter string
    printf("Name: ");
    puts(name); // display string
    _getch();
}

Enter name: Dung_cute
Name: Dung_cute

这个错了:

#include <stdio.h>
int main() {
    char name[20];
    printf_s("Enter name: ");
    scanf_s("%c", name); // enter string
    printf("Your name is: %s.", name);
    _getch();
}

Enter name: Dung_cute
Your name is: D?????aietnauie'ai.

【问题讨论】:

  • 请添加更多代码供我们查看
  • 请发布您的代码和输出文本而不是图像,请参阅How to Ask

标签: c printf scanf


【解决方案1】:

scanf_s 还要求您提供要读取的字节数。默认情况下,它只读取一个。

更多信息请查找here

示例(来自上面的链接):

result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                 &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );

因此,你的

scanf_s 应该是这样的:

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

您可能还需要将类型说明符更改为“%s”。我手头没有 Visual Studio 可供测试。

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

【讨论】:

  • 我明白了。非常感谢您的帮助,我为此问题浪费了很多时间。
  • 不客气。它可能发生在任何人身上。这只是更仔细阅读手册的问题 - 在这种情况下,scanf_s() 的语法和参数。
  • @LeDung 这个答案能解决你的问题吗,不要犹豫接受它(meta.stackexchange.com/a/5235/519684
  • 我想成为一名嵌入式工程师,所以我尝试学习 C 程序,我觉得很难,但也许你说的是真的:只需要学会正确地做事。再次感谢您。这是我第一次在 Stack Overflow 上提问。
  • @LeDung:一步一步来。在你真正理解它为什么起作用之前,不要关闭一个话题。在编译之前不要只是复制和粘贴代码序列,而是要加倍努力去理解每一行和每个字符。如果你这样做,事情会(相对)容易。
【解决方案2】:

无论你正在学习什么资源,立即停止它。

用 C 编程是危险的,任何推荐 gets 函数的资源都不能胜任这项任务。如果你继续使用这个资源来学习,你会写出一直崩溃的代码,并且会出现缓冲区溢出等安全漏洞。

【讨论】:

  • 喝水也很危险,但这并不意味着我们必须阻止它。我们只需要学会正确地做事。
  • @virolino 无法正确使用getsstackoverflow.com/q/1694036
  • 我同意使用 gets() 可能会导致问题,但对于 C 中的几乎所有其他内容也是如此。“for”循环超出边界,“printf”和“scanf”可能也很危险,不受欢迎的无限循环并不罕见,示例可以继续。有了C,一切都是祝福,一切也是诅咒。程序员的技能和经验使事情变得正确。而且我什至没有开始讨论指针和动态分配。
  • @virolino 尽管我想用“请使用可靠的编程语言”来评论每个初学者的 C 问题,但对于一个人来说,工作量太大了。
  • 如果使用得当,C 是非常可靠的。多亏了它,现代汽车和飞机才能安全运行。告诉人们远离 C,因为它不可靠,就像告诉人们远离食物,因为它可能会变质。与许多其他语言不同,C 语言如今仍然非常流行,这正是因为它非常可靠。如果你是一个反对所有人的“单身人士”,那么你应该修改你的一些观点,也许吧。
猜你喜欢
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多