【问题标题】:C - equivalent of .NET Console.ReadLineC - 等效于 .NET Console.ReadLine
【发布时间】:2011-01-29 04:36:35
【问题描述】:

我需要完成与 .NET Console.ReadLine 函数提供的相同的行为。当用户按下回车键时,程序应该继续执行。

以下代码是不够的,因为它需要额外的输入:

printf ("Press Enter to continue");
scanf ("%s",str); 

有什么建议吗?

【问题讨论】:

  • 我认为您通过要求 ReadLine 功能混淆了这个问题,但只需要实际读取一个字符;因此答案多种多样。我曾经使用过 Console.ReadKey()

标签: c console scanf enter


【解决方案1】:

使用函数getchar()

【讨论】:

  • 获取单个字符,而不是一行。 Perrhaos 你的意思是 gets() 但这是一个危险的函数,应该使用 fgets() 代替。
  • @Clifford,OP 确实显示了用户按下单个键的示例(例如 [enter])...
  • 啊!我正在解决实现 Console.ReadLine() 功能的要求。我现在明白你的意思了。
【解决方案2】:

试试这个:

printf ("Press Enter to continue"); 
scanf(“%[^\n]“,str);

【讨论】:

    【解决方案3】:

    你可以像这样使用 fgets():

    #include <stdio.h>
    
    fgets(buf, sizeof(buf), stdin);
    

    【讨论】:

      【解决方案4】:

      getline 在大多数情况下可能比getchar 好。它允许您在“输入”之前捕获所有用户的输入,并且不受缓冲区溢出的影响。

      char *buf=NULL;
      printf("Press enter to continue: ");
      getline(&buf,0,stdin);
      // Use the input if you want to
      free(buf); // Throw away the input
      

      【讨论】:

      • 您所说的对于gets() 是正确的,而不是getchar(),它只从stdin 获取一个字符。请注意,getline() 是标准库的 GNU 扩展。 C++ 有类似的 istream::getline() 和 ::getline() 函数,不要混淆。在 ISO C 中,使用 fgets()。
      • @Clifford:getchar 将响应 any 字符,而不仅仅是输入。现在,这可能是 OP 的意图,它起作用,但这不是他所要求的。但我的问题是,如果用户不注意,它会有点脆弱(即他们忘记提示即将到来并开始输入下一个命令,getchar 立即吃掉第一个字符,因此终端不会暂停,他们的下一个输入是短的主角)。是的,fgets 是 c 标准,但如今 getline 已成为 POSIX 的一部分,而不再只是 GNU 的东西。
      • 啊!我正在解决实现 Console.ReadLine() 功能的要求。我现在明白你的意思了。虽然 getchar() 不受缓冲区溢出的影响,并且 stdin 是行缓冲的,但在按下 ENTER 之前不会返回。
      • 关于 getline() 是 POSIX;是的,但不是Win32。从标签中不清楚这将在 POSIX 上实现。我不反对它的使用,只是想明确一下可移植性。
      • @Clifford:很公平。我生活在一个 POSIX 世界中,这为我的思想增添了色彩。
      【解决方案5】:

      你可以在 scanf 函数中使用 do while。

      do{
          scanf("%s",str1);
      }while(str1[0] == '\0' || str1[0] == '\r' || str1[0] == '\n');
      

      【讨论】:

      • 请不要在您的帖子中包含签名。尤其是不包含链接的。您可以在您的个人资料中执行此操作。
      猜你喜欢
      • 2013-12-02
      • 2015-12-05
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2012-01-18
      • 2017-03-12
      相关资源
      最近更新 更多