Для начала функция read
должна принимать свой аргумент по ссылке, например
void read(struct id *s);
В противном случае ее аргумент не имеет смысла.
Обратите внимание, что такой вызов scanf
scanf("%s", s.id_num);
небезопасно. Используйте вместо fgets
. Для примера
void read( struct id *s )
{
//...
fgets( s->id_num, sizeof( s->id_num ), stdin );
s->id_num[strcspn( s->id_num, "\n" )] = '\0';
Функция isNumber
очень проста.
int isNumber( const char p[] )
{
const char *s = p;
while ( isdigit( ( unsigned char )*s ) ) ++s;
return p[0] != '\0' && *s == '\0';
}
То есть переданная строка не должна быть пустой (условие p[0] != '\0'
). В противном случае очевидно, что он не содержит все цифры.
Второе условие *s == '\0'
означает, что мы проверяли все символы строки до конечного нуля. То есть строка содержит только цифры.
Вот демонстрационная программа.
#include <stdio.h>
#include <ctype.h>
int isNumber( const char p[] )
{
const char *s = p;
while ( isdigit( ( unsigned char )*s ) ) ++s;
return p[0] != '\0' && *s == '\0';
}
int main(void)
{
printf( "Is a number - %s\n", isNumber( "" ) ? "true" : "false" );
printf( "Is a number - %s\n", isNumber( "A" ) ? "true" : "false" );
printf( "Is a number - %s\n", isNumber( "12A" ) ? "true" : "false" );
printf( "Is a number - %s\n", isNumber( "123" ) ? "true" : "false" );
return 0;
}
Ее вывод
Is a number - false
Is a number - false
Is a number - false
Is a number - true