带有Visual Stuido的C中的scan_s(),printl_s()和char问题

时间:2019-05-17 06:26:26

标签: c printf scanf

在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.

2 个答案:

答案 0 :(得分:4)

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));
          ^

答案 1 :(得分:0)

无论您从中学到什么资源,都应立即停止。

用C语言编程很危险,建议使用gets函数的所有资源都无法胜任。如果您继续使用此资源进行学习,您将编写的代码始终崩溃,并且将存在诸如缓冲区溢出之类的安全漏洞。