meiryo
meiryo

Reputation: 11687

Create a new string that contains only alphanumeric characters from the old string

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!

Upvotes: 1

Views: 6563

Answers (4)

kwadr4tic
kwadr4tic

Reputation: 796

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.

Upvotes: 1

Sangeeth Saravanaraj
Sangeeth Saravanaraj

Reputation: 16607

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!

Upvotes: 0

Shamim Hafiz - MSFT
Shamim Hafiz - MSFT

Reputation: 22104

Since this is homework, here is the verbal description:

Run a loop over the original string and use the functions isalnum() to determine if a character is alphanumeric. Maintain a second char array of reasonable size and every time you encounter an AlphaNum, insert it to that array. Once all AlphaNum characters have been copied to the second array, NULL terminate it and you have your string.

Note: isalnum() is defined in ctype.h, so if you aren't allowed to use that, you may have to define this function for yourself. That is another exercise of it's own.

Upvotes: 1

Fred Foo
Fred Foo

Reputation: 363627

  1. Allocate a new char array of the same length as your string. Convince yourself that this is enough space. Don't forget the NUL.
  2. Loop through the string, copying to the new string only those characters that are alphanumeric. You can't do this portably without also including <ctype.h> and using a function/macro from that header, unless you're going to enumerate all characters that you consider alphanumeric.
  3. Again, don't forget the NUL.

Upvotes: 3

Related Questions