I would advise you to use both fgets and sscanf:
- fgets allows you to read a certain number of characters (which can be read from stdin).
- sscanf allows you to read formatted input from a string (which you got from fgets).
By combining those, you can read 7 characters from standard input (8 if you add the \0) and then parse those to get the two values you're looking for.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    // 8 chars long for string and terminating `\0`
    char *ID = calloc(8, 1);
    
    // extra char for same reason as above
    char *IDchar = calloc(4, 1);
    int IDnum, processed;
    
    // get the string and verify it's 7 characters long
    if (fgets(ID, 8, stdin) && strlen(ID) == 7) 
        sscanf(ID, "%3s%4d%n", IDchar, &IDnum, &processed);
    if (processed == 7)
        printf("success");
    else
        printf("failure");
}
The %n will collect the number of characters processed by the sscanf, ensuring you parsed the right number of characters.
note that this is a VERY dangerous parameter, and you should always verify your input length before using it.
Edit:
If you do not want to use arrays at all, and only want to verify the input format without storing or reusing it, you can use getc to read the characters one at a time and verify their value:
#include <stdio.h>
#include <ctype.h>
int isEnd(int c)
{
    return c == '\n' || c == EOF;
}
void main()
{
    int tmp;
    int valid = 1;
    //check the first 3 characters
    for(int v = 0; v < 3 && valid; v++)
    {
        // read a char on standard input
        tmp = fgetc(stdin);
        // check if tmp is a letter
        valid = islower(tmp) || isupper(tmp);
    }
    //check the next 4 characters
    for(int v = 0; v < 4 && valid; v++)
    {
        // read a char on standard input
        tmp = fgetc(stdin);
        // check if tmp is a numeral
        valid = isdigit(tmp);
    }
    if (valid)
    {
        printf("format OK\n");
        // Check that the input is finished (only if format is OK)
        tmp = fgetc(stdin);
        if (isEnd(tmp))
            printf("length OK\n");
        else
            printf("length KO: %d\n", tmp);
    }
    else
    {
        printf("format KO\n");
    }
}
As I said before, this will only check the validity of the input, not store it or allow you to reuse it. But it does not use arrays.
Edit 2:
Another thing to watch out for with fgetc or getc is that, though it will manage longer inputs properly, it will get stuck waiting for the chars to be provided if there aren't enough. Thus make sure to exit the moment you read an incorrect character (if it's an end-of-line char, there won't be any more coming)
Edit 3:
Of course I'd forgotten malloc.
Edited the first answer.