我有一个代码,我希望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();
}
答案 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();
}
}
}
显然你可以重构这一点,把所有重复的代码放在一个精心设计的函数中,但希望你能得到这个想法。