Достаточно простого getline
, как в C & C ++,
просто используйте ifs внутри, чтобы проверить данные, которые он уже вставил, и новые данные, если они соответствуют требованиям, отправляются.
В противном случае, если он поставил неверные данные в ключевой момент, попросите его снова и сбросьте данные, которые он уже ввел.
Это образец, работающий в C, поэтому вы должны иметь возможность скопировать его в C #
с небольшой переработкой, для ввода одного символа за один раз.
#include <stdio.h>
#include <stdlib.h>
int is_upper(char *str)
{
int idx = 0;
if (str[idx] >= 'a' && str[idx] <= 'z') {
return (0);
}
if (str[idx] >= 'A' && str[idx] <= 'Z') {
return (1);
}
return (2);
}
int main(void)
{
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
int mystrlen = 0;
char finalstring[2048]; //to ease the algorithm so there is no need to do a dynamic allocation due to C behavior
while ((read = getline(&line, &len, stdin)) != -1) {
if (strlen(line) == 2) { // because \n == 1 char
if (mystrlen == 0 && line[0] >= 'A' && line[0] <= 'Z') {
strcat(finalstring, line);
mystrlen++; //first letter = UPPER CASE
}
else if (is_upper(line) == 2 || is_upper(line) == 1 || mystrlen == 0) { //if first letter is good & we aren't at first letter, or simply bad char input
mystrlen = 0;
finalstring[0] = '\0';
printf("reset\n");
}
else if (is_upper(line) == 0) { //when all is good
strcat(finalstring, line);
printf("\n%s\n", finalstring);
}
}
else {
mystrlen = 0;
finalstring[0] = '\0';
printf("reset\n");
}
}
}