У вашего кода есть некоторые проблемы. Вот лучший способ сделать это (непроверенные):
bool validate_int(char input[]) /* Bad function name; See @Filipe's comment */
{
for(;;) /* Infinite loop */
{
if(fgets(input, 10, stdin) == NULL) /* If fgets failed */
{
puts("fgets failed");
return false;
}
int i, len = strlen(input);
if(len > 0 && input[len - 1] == '\n') /* If there is a newline character at the end of input */
input[--len] = '\0'; /* Replace the '\n' with '\0' and decrement len */
if(!isalpha(input[0])) /* If the first character of input is not an alphabet */
continue; /* Loop again */
if(len == 1) /* There is no number */
continue;
for(i = 1; i < len; ++i)
{
if(!isdigit(input[i])) /* If not a digit */
continue; /* Loop again */
}
break; /* Get out of the loop */
}
return true;
}
Более лучше всего было бы отделить ввод и проверку в двух отдельных функций (непроверенные):
bool getInput(char input[])
{
if(fgets(input, 10, stdin) == NULL) /* If fgets failed */
{
puts("fgets failed");
return false;
}
int len = strlen(input);
if(len > 0 && input[len - 1] == '\n') /* If there is a newline character at the end of input */
input[--len] = '\0'; /* Replace the '\n' with '\0' and decrement len */
return true;
}
bool validate(char input[])
{
if(!isalpha(input[0])) /* If the first character of input is not an alphabet */
return false;
int i, len = strlen(input);
if(len == 1) /* There is no number after the character */
return false;
for(i = 1; i < len; ++i)
{
if(!isdigit(input[i])) /* If not a digit */
return false;
}
return true;
}
и в вызывающей функции (опять же, непроверенные),
char input[10];
if(getInput(input))
{
if(validate(input))
{
puts("Input is in correct format");
}
else
{
puts("Input is in wrong format");
}
}
else
{
puts("Failed to get input");
}
Вы никогда не должны игнорировать возвращаемое значение операции ввода. Ваш подход нарушен без ремонта. –
@KerrekSB Uh ... Только если требуется проверка ошибок. Я слышал, что люди говорят это много, но серьезно, это, вероятно, крошечная игрушечная программа для обучения строковым операциям, а не для изучения ошибок ввода-вывода. – immibis
Я просто хочу проверить элементы массива, которые начинаются с индекса no 1, является целым, а не другим типом. –