954,505 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

need help with tricky string modyfication

Let's assume that the 100th user inputs his name as: Jackson Michael.

I would like my prog to print to the file the reference, which would be combining the first letter of the lastname with all the consonants remaining after removing all vowels (a,e,i,o,u).

in case of Jackson it would be: JCKSN100

any ideas how to accomplish that? as of right know all the inputted names are in an array and each element is a plain string.

Thanks in advance

DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

Perhaps begin with a function called 'isVowel()', which returns true or false, depending on the type of letter passed to it.

Then implement your own 'strcpy' like function, which makes use of isVowel()

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

Perhaps begin with a function called 'isVowel()', which returns true or false, depending on the type of letter passed to it.

Then implement your own 'strcpy' like function, which makes use of isVowel()

I would convert all the characters to upper case first, using toupper()

Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 

Thanks guys, I will try to make something out of it, but that sounds like a good starting point. If anyone alse has any suggestions, please feel free to input your thoughts

DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 
Thanks guys, I will try to make something out of it, but that sounds like a good starting point. If anyone alse has any suggestions, please feel free to input your thoughts


Given a string without undesirable characters like '\n', etc...

*
 * abbr.c
 * Converts string to upper case and removes vocals
 */
#include <stdio.h>
#include <ctype.h>

int main( void )
{
    char name[]= "Jackson100";    /* given string */
    int i = 0, x = 0;    /* indexes */
    int len = strlen( name ) + 1;    

    /*  Make string to upper case and removing vocals */
    for( i = 0; i < len; i++ )
    {
        switch( name[i] = toupper( name[i] ) )
        {
            case 'A':
                break;
            case 'E':
                break;
            case 'I':
                break;
            case 'O':
                break;
            case 'U':
                break;
            default:
            {
                name[x] = name[i];
                ++x;
            }
        }
    }
    printf( "%s\n", name );    /* for testing purposes */
    
    getchar();
    return 0;
}

/* output: JCKSN100 */
Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 

Thanks man, by the time I checked I got ready almost the same thing except I used if instead of switch. Very much appreciated.

Best Regards
DeathEvil

DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

Thanks man, by the time I checked I got ready almost the same thing except I used if instead of switch. Very much appreciated.

Best Regards DeathEvil

You're welcome. I don't know if that is how professionals would do it,
but that's one way I would.

Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 

More homework on a plate, very disappointing :icon_frown:

You should have waited more than 5 minutes to see what the OP could come up with before blurting out an answer.

So instead of the OP getting to practice the all important analytical and problem solving skills, they're going to have to try to practice them on the next problem instead (only that will be so much harder now).

Oh well, nevermind, no great loss I suppose.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

More homework on a plate, very disappointing :icon_frown:

You should have waited more than 5 minutes to see what the OP could come up with before blurting out an answer.

So instead of the OP getting to practice the all important analytical and problem solving skills, they're going to have to try to practice them on the next problem instead (only that will be so much harder now).

Oh well, nevermind, no great loss I suppose.

I appreciate the concern but like I mentioned before I came up with basically the same thing, only I used if statement instead of swicth.:)

DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

So start posting what you have, instead of always posting these open ended questions which beg for spoon feeding.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

ok yesterday I have ran into a little trouble. The stub alone was working great but now when I externalized the function, i cannot get the desired output. I have already tried many things but I suspect it has something with passing the arrays into the function. Again, I'm able to compile the program and run it, it's the output of this function that is not correct.

void Find_Reference_Code(FILE *report, char last_name[MAXA][FL], int i, int i2, int index[MAXA])
{

        // FL is defined as 10
	int x = 0, x2 = 0; int len, check_num = 100;

	len = strlen( last_name ) + 1;

	//let's assume the last_name calling element is Jackson

	printf("before cases\n %s", last_name); // shows "Jackson" like it supposed to
   for( x = 0; x < len; x++ )
   {
      switch(last_name[x][FL] = toupper( last_name[x][FL] ) )
      {
         case 'A':
            break;
         case 'E':
            break;
         case 'I':
            break;
         case 'O':
            break;
         case 'U':
            break;
          default:
         {
			last_name[x2][FL] = last_name[x][FL];
            ++x2;
			
         }
      }

   }
   	  printf( "after cases\n%s", last_name); // shows Jackson100, instead of JCKSN100 so the the whole stich is skipped. 
	  printf("%d\n", check_num);
	  check_num++;
}
DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

But your loop is processing a COLUMN of the array (an out of bound one at that), not a row.

> len = strlen( last_name ) + 1;
Please tell me that your compiler is generating warnings for this.

If it is, I would suggest some study and at least clean up all those problems.

Say for example that the 'i' parameter is the line you want to change.

Then you would have
len = strlen( last_name[i] ) + 1;

Then some switch(last_name[i][x] = toupper( last_name[i][x] ) )

Then at the end printf( "after cases\n%s", last_name[i]);

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

Thanks for the reply Salem.
After compiling the code below the only warning I'm getting is for converting float to short int (len is getting demoted). After those slight modifications after inputting "Jackson" I'm getting y100
which clearly indicates that the last name is not processed in switch i suppose. How can I change the processing from columns to rows? or where I can read about it? a link would be great if you have one.

Thanks

void Find_Reference_Code(FILE *report, char last_name[MAXA][FL], int i, int i2, int index[MAXA])
{

	int x = 0, x2 = 0; int len, check_num = 100;

	len = strlen( last_name[x] ) + 1;



	fprintf(report, "   before cases: %s\n", last_name);  //prints Jackson
   for( x = 0; x < len; x++ )
   {
      switch(last_name[x][FL] = toupper( last_name[x][FL] ) )
      {
         case 'A':
            break;
         case 'E':
            break;
         case 'I':
            break;
         case 'O':
            break;
         case 'U':
            break;
          default:
         {
			last_name[x2][FL] = last_name[x][FL];
            ++x2;
			
         }
      }

   }
   fprintf(report, "   after cases :%s%d\n", last_name[x], check_num); // prints y100
	  check_num++;
}
DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

Read my post again.
All those references to last_name[x][FL] in the code body are out of bounds.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

You are having a little bit of a problem with the subscripts in the multi-dimensional array. In order for you to reference them correctly, you need a nested loop.

int i, x;

for( i = 0; i < MAXA; i++ )
{
    for( x = 0; x < len; x++ )
    {
         ...Here goes the switch.
    }
}


This statement will give you ALWAYS the length of the first string, by virtue of x = 0. It needs to be inside the first loop and before of the second loop, so you can obtain the length of the current working on string. Right now you are using the lenght of the first string for every case.

len = strlen( last_name[x] ) + 1;

You are ALWAYS trying to convert to upper case whatsoever lives at the last position of the multi-dimension, which doesn't contain any part of your inputed string.

switch(last_name[x][FL] = toupper( last_name[x][FL] ) )

The swith should be inside the second loop, and if you use the same
indexes it would be like

switch( last_name[i][x] = toupper( last_name[i][x] ) )
Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 

thank you for all the help; I got it to work, but as it turns out I cannot do it that way because later on I'm referring to the last name string and I need it as a whole. Then it hit me that the best way to do it, is to assign the actual last name string to a temporary string, take off the vowels from the temporary sting, print it, and that way the original last name would be untouched. This is how I attempted to do it, but the program prints some trash. I'm sure this is assigning problem, so if anyone could point out how to assign it.

void Find_Reference_Code(FILE *report, char last_name[MAXA][FL], int i, int i2, int index[MAXA], short int check_number)
{

	char ref[] = {last_name[index[i2]]};
	int x = 0, x2 = 0; int len;

	len = strlen( ref ) + 1;

   for( x = 0; x < len; x++ )
   {
      switch( ref[x] = toupper( ref[x] ) )
      {
         case 'A':
            break;
         case 'E':
            break;
         case 'I':
            break;
         case 'O':
            break;
         case 'U':
            break;
          default:
         {
			ref[x2] = ref[x];
            ++x2;
			
         }
      }
   }
   fprintf(report, "*   Reference: %.10s%d\n", ref, check_number);
DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

never mind, I finally got it to work by using strcpy to copy last_name[index[i2]] to ref.

Thanks a bunch to everyone!

DeathEvil
Light Poster
49 posts since Jul 2007
Reputation Points: 10
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You