如何解决 C 中 gets() 函数的问题?

How can I fix the problem with gets() function in C?

gets 函数有问题。我写的第一个 gets 不工作,但接下来的工作正常。

我在开头放了一个额外的gets()函数,程序直接跳过它并获取我想要的字符串。但它并不安全可靠。那么 gets 有什么问题,我该如何解决?

if (choice == 1) {
  printf("Please enter an English phrase with upper case: ");
  gets(a);
  gets(engphr);
  for (i = 0; engphr[i] != '[=10=]'; i++) {

正如 Eraklon 在他们的评论中提到的那样,最可能的原因是您在 gets 调用之前有一个 scanf 调用,并且之前输入的尾随换行符被 gets 在您有机会输入任何其他内容之前。

无论如何你都不应该使用 gets - 它已从 2011 版语言的标准库中删除。使用它本质上是不安全的,并且 在您的代码中引入安全漏洞。请改用 fgets。它的行为略有不同(如果有空间,它会将尾随的换行符保存到输入缓冲区,gets 丢弃它),但它更安全:

if ( fgets( engphr, sizeof engphr, stdin ) ) // assumes engphr is declared as an array, not a pointer
{
  // process engphr
}

话虽如此,您真的不应该混合调用 scanffgets,因为 scanf 会在先前输入的输入流中留下尾随换行符,并且 fgets 将在看到该换行符后立即 return 。使用 fgets 读取所有输入并使用 sscanf 从输入缓冲区读取特定项目,或者使用 scanf 读取所有输入。