fgets之间空stdin

时间:2017-01-11 23:23:54

标签: c stdin fgets

我有一个代码,我希望2个用户输入20 char max。 我想只保留20.我的问题是,在第一次输入后,如果用户输入超过20个字符,那些字符仍然在stdin中,所以它将被下一个fgets读取。

  char *pseudo = malloc(21);
  fgets(pseudo,21,stdin);
  strtok(pseudo,"\n");

  char * tube = malloc(21);
  fgets(tube,21,stdin);
  strtok(tube,"\n");

我发现以下解决方案在2个fgets调用之间清空stdin,它可以工作,但它在2个调用之间阻塞:我必须输入一些东西才能被问到第二个输入。

int c = 0;
    while (c != '\n' && c != EOF)
    {
        c = getchar();
    }

1 个答案:

答案 0 :(得分:2)

你有几个问题:

  • 您的循环逻辑已损坏。
  • 如果您检测到输入行没有以换行符结尾,那么您应该只执行修复循环,这根本就没有完成。

就像这个简单的例子:

01234567890123456789012345
0123456789012345678

<强>输入

01234567890123456789 : 0123456789012345678

<强>输出

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication41
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "Int section : 203\n" +
                "String start_time : 00:16:38,731\n" +
                "String end_time : 00:16:41,325\n" +
                "String Content :\n" +
                "Happy Christmas.\n" +
                "your arse I pray God it's our last.\n";

            string pattern =
               @"Int section :\s+(?'section'\d+)\s+" +
               @"String start_time :\s+(?'start'[\d:,]+)\s+" +
               @"String end_time :\s+(?'end'[\d:,]+)\s+" +
               @"String Content :(?'content'[^$]+)";

            Match match = Regex.Match(input, pattern, RegexOptions.Multiline);
            Console.WriteLine(match.Groups["section"].Value.Trim());
            Console.WriteLine("{0} --> {1}", match.Groups["start"].Value.Trim(), match.Groups["end"].Value.Trim());
            Console.WriteLine(match.Groups["content"].Value.Trim());
            Console.ReadLine();
        }
    }

}

显然你可以重构这一点,把所有重复的代码放在一个精心设计的函数中,但希望你能得到这个想法。