Question: Using only stdio.h, string.h and stdlib.h libraries how would I go about implementing this?

I'm quite new to programming so please bear with me!

Answer: 
Every char you read in your string is a byte (you can think it as a number between 0 and 255, and that's how the computers handle them) so you just need to check the ascii table to see what letter refers to.

Every alphanumerical char is in this range: [48, 58] (for numbers), or [65, 90] (upper case), or [97, 122] (lower case).

Look at this:

```
#include <stdio.h>
#include <stdlib.h>

#define SIZE    64

int isalphanum(char);    /*states if a char is alphanumerical or not*/
char *getalphanum(char *, char*);    /*modifies the second string to get the result*/

int main(void) {
    char in[SIZE] = "Hello, W@#@#@#@#@#orl...,.,d!";    /*just a random to try out*/
    char out[SIZE];
    getalphanum(in, out);
    printf("%s", out);
    return 0;
}

int isalphanum(char a) {
    if ((a >= 48) && (a <= 58))
        return 1;
    if ((a >= 65) && (a <= 90))
        return 1;
    if ((a >= 97) && (a <= 122))
        return 1;
    return 0;
}

char *getalphanum(char *s, char *t) {
    if ((s == NULL) || (t == NULL))    /*tests if the strings are "handble"*/
        return NULL;
    int i = 0;
    int j = 0;
    char c;
    while ((c = *(s + i)) != '\0') {
    if (isalphanum(c)){
        *(t + j) = c;
        j++;
    }  
    i++;
    }
    *(t + j) = '\0';
    return t;
}

```

This code works and is very simple and can be improved, but there is evertything you need.
The best way is to use the `isalnum()` from `ctype.h` but now that is not an option, I have written a not-standard/non-portable function called `isalnum_not_prefered()` which is the equivalent of `ctype.h`'s `isalnum()`. 

```
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int isalnum_not_prefered(char s) 
{
    if((s >= 'A' && s <= 'Z') || 
       (s >= 'a' && s <= 'z') || 
       (s >= '0' && s <= '9')) 
        return 1;
    return 0;
}

int main(void)
{
    char str[] = "this!234$#&@#$^is5@#$a#@$4677~=_?}valid2234kjstring";
    int len = strlen(str);
    int i, j=0;

    char *newstr1 = NULL;
    char *newstr2 = NULL;

    if ((newstr1 = (char *) malloc(sizeof(char) * len + 1)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    for (i=0 ; i<len ; i++) {
        if (isalnum(str[i])) {
            newstr1[j] = str[i];
            j++;
        }
    }
    newstr1[j] = '\0';

    if ((newstr2 = (char *) malloc(sizeof(char) * len + 1)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    j=0;
    for (i=0 ; i<len ; i++) {
        if (isalnum_not_prefered(str[i])) {
            newstr2[j] = str[i];
            j++;
        }
    }
    newstr2[j] = '\0';

    printf("string  : %s \n", str);
    printf("result1 : %s \n", newstr1);
    printf("result2 : %s \n", newstr2);

    free(newstr1);
    free(newstr2);

    return 0;
}

```

Points to note:

1. strings in `C` is terminated with `\0`. So the new string that your are populating should also terminate with `\0`
2. `malloc()`'ed memory must be `free()`'ed
3. `malloc()` errors should be handled
4. this code is not portable as it assumes the machines character set to be `ASCII`. If the hardware supports some other character set (say `EBCDIC`) then this may not work as expected.

Hope this helps!