scanf_s导致 Code::Blocks C 程序中没有输出和意外调试退出的问题

Issue with scanf_s causing no output and unexpected debugging exit in Code::Blocks C program

提问人:kadu 提问时间:10/9/2023 更新时间:10/9/2023 访问量:46

问:

我在 Code::Blocks 中编写 C 程序时遇到了问题。尽管该程序运行没有错误,但当我使用 scanf_s(“%c %c %c”, &a, &b, &c);语句,并且在调试期间,它总是在 scanf_s 语句处意外退出。如何解决此问题?

#include <stdio.h>
int main() {
    char a;
    char b;
    char c;
    scanf_s("%c%c%c",&a,1,&b,1,&c,1);
    printf("%c %c %c\n", a, b, c);
    return 0;
}

在此处输入图像描述

在此处输入图像描述我是 C 编程的新手,我试图将语句修改为 scanf_s(“%c%c%c”, &a, 1, &b, 1, &c, 1);,这导致程序成功执行。您能否解释一下为什么此更改解决了该问题?

C 代码块

评论

2赞 HolyBlackCat 10/9/2023
在我这边工作,从 MSYS2 安装 GCC。但我会避免(和其他功能)并使用.scanf_s_sscanf
3赞 fukanchik 10/9/2023
它在这里:learn.microsoft.com/en-us/cpp/c-runtime-library/reference/......它说:。因此,您必须指定使用此函数期望的方法的大小。Unlike scanf and wscanf, scanf_s and wscanf_s require you to specify buffer sizes for some parameters. Specify the sizes for all c, C, s, S, or string control set [] parametersc
3赞 Some programmer dude 10/9/2023
“安全”或“安全”功能(带有后缀)的添加是因为Microsoft引入了它们,并且实际上是唯一使用它们的功能。一个主要问题是 C 规范指定的函数与 Microsoft 自己的实现不同。尽管它们应该是便携式的,但事实并非如此。除非你被要求使用它们,否则我的建议是你不要使用。_s
0赞 Some programmer dude 10/9/2023
话虽如此,即使是这个通用的 scanf(和系列)引用也说该格式需要一对参数,第二个参数是大小。如果不将正确和预期的参数传递给函数,则不应期望它们起作用。%c
0赞 Jabberwocky 10/9/2023
不要用,就用。代表“安全”,但在您的水平上,安全性不是您需要担心的事情。scanf_sscanf_s

答:

1赞 chux - Reinstate Monica #1
  • "%c"期望 2 个参数,一个指针 () 和大小 (scanf_s()char *int)

  • 更好的代码会检查结果值。

  • OP 可能需要一个前导空格来使用空格

  • 考虑用作读取用户输入行的替代方法。fgets()

if (scanf_s(" %c%c%c",&a,1,&b,1,&c,1) != 3) {
  printf("Oops\n");
} else {
  printf("%c %c %c\n", a, b, c);
}