Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > substring function

Reply
Thread Tools

substring function

 
 
Radhika Sambamurti
Guest
Posts: n/a
 
      02-20-2004
Hi,
I've written a substring function.
The prototype is: int substr(char s1[], char s2[])
Returns 1 if s2 is a substring of s1, else it returns 0.
I have written this program, but Im sure there is an easier way to do this. I am hoping someone can point me to a more elegant way of writing this same function.

//// code follows ///////////

//implement a substring function, where if string2 is a sub of string 1, then the value returned is 1 else, 0

#include<iostream>
#include<cstring>
using namespace std;

const int MAX = 10;
int substring(char *str1, char *str2); //prototype

int main()
{
char response = 'y';
char str1[MAX];
char str2[MAX];
int result = 0;

while(response == 'Y' || response == 'y')
{
cout << "Please enter string 1: " ;
cin >> str1;

cout << "\nPlease enter string 2: ";
cin >> str2;

cout << endl;

result = substring(str1, str2); //function call

if(result == 1)
cout << "string " << str2 << " is a substring of " << str1 << endl;
else
cout << "string " << str2 << " is NOT a substring of " << str1 << endl;

cout << "would you like to enter another? (Y/N) " << endl;
cin >> response;

}

return 0;
}

//''''''''''''''''''''''''''''''''''''''''''
//Function definition substring

int substring(char *str1, char *str2)
{
int len1, len2, i=0, j = 0, k, n;
len1=strlen(str1); //determine the lengths of the strings
len2=strlen(str2);


while(i <len1)
{

while( str2[j] == str1[i] )
{

for(k=1, n=i+1; k<len2; k++, n++)

//n is assigned i, which is where the match //starts in string 1- starting at the next letter

{
if( str2[k] != str1[n] )
return 0; //the match fails after having made an initial match
}
return 1;

j++;
}

i++;
}


}








 
Reply With Quote
 
 
 
 
Joe C
Guest
Posts: n/a
 
      02-20-2004

"Radhika Sambamurti" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) rg...
> Hi,
> I've written a substring function.
> The prototype is: int substr(char s1[], char s2[])
> Returns 1 if s2 is a substring of s1, else it returns 0.
> I have written this program, but Im sure there is an easier way to do

this. I am hoping someone can point me to a more elegant way of writing this
same function.
>


Why not use the std::string member functions?

find( )
find_first_of( )
find_last_of( )
find_first_not_of( )
find_last_not_of( )
rfind( )

These return the starting position of the where the match is found, or a -1
cast to unsigned int if no match is found.


 
Reply With Quote
 
 
 
 
Julie J.
Guest
Posts: n/a
 
      02-20-2004
How about this:

int substring(char *str1, char *str2)
{
return (strstr(str1, str2) != NULL);
}

-jj-

Radhika Sambamurti wrote:
>
> Hi,
> I've written a substring function.
> The prototype is: int substr(char s1[], char s2[])
> Returns 1 if s2 is a substring of s1, else it returns 0.
> I have written this program, but Im sure there is an easier way to do this. I am hoping someone can point me to a more elegant way of writing this same function.
>
> //// code follows ///////////
>
> //implement a substring function, where if string2 is a sub of string 1, then the value returned is 1 else, 0
>
> #include<iostream>
> #include<cstring>
> using namespace std;
>
> const int MAX = 10;
> int substring(char *str1, char *str2); //prototype
>
> int main()
> {
> char response = 'y';
> char str1[MAX];
> char str2[MAX];
> int result = 0;
>
> while(response == 'Y' || response == 'y')
> {
> cout << "Please enter string 1: " ;
> cin >> str1;
>
> cout << "\nPlease enter string 2: ";
> cin >> str2;
>
> cout << endl;
>
> result = substring(str1, str2); //function call
>
> if(result == 1)
> cout << "string " << str2 << " is a substring of " << str1 << endl;
> else
> cout << "string " << str2 << " is NOT a substring of " << str1 << endl;
>
> cout << "would you like to enter another? (Y/N) " << endl;
> cin >> response;
>
> }
>
> return 0;
> }
>
> //''''''''''''''''''''''''''''''''''''''''''
> //Function definition substring
>
> int substring(char *str1, char *str2)
> {
> int len1, len2, i=0, j = 0, k, n;
> len1=strlen(str1); //determine the lengths of the strings
> len2=strlen(str2);
>
>
> while(i <len1)
> {
>
> while( str2[j] == str1[i] )
> {
>
> for(k=1, n=i+1; k<len2; k++, n++)
>
> //n is assigned i, which is where the match //starts in string 1- starting at the next letter
>
> {
> if( str2[k] != str1[n] )
> return 0; //the match fails after having made an initial match
> }
> return 1;
>
> j++;
> }
>
> i++;
> }
>
>
> }
>
>
>
>
>
>
>
>

 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      02-20-2004
Radhika Sambamurti wrote:
>
> Hi,
> I've written a substring function.
> The prototype is: int substr(char s1[], char s2[])
> Returns 1 if s2 is a substring of s1, else it returns 0.



Why? Is this for a school exercise, or self-teaching? The above function
is almost, but not quite, the same as the C standard function strstr().

Why even mess with C-style strings?

> I have written this program, but Im sure there is an easier way to do this. I am hoping someone can point me to a more elegant way of writing this same function.


int substr(char s1[], char s2[])
{
if (strstr (s1, s2))
return 1;
return 0;
}



> int substring(char *str1, char *str2)
> {
> int len1, len2, i=0, j = 0, k, n;
> len1=strlen(str1); //determine the lengths of the strings
> len2=strlen(str2);


These calls to strlen() are going to whack your efficiency. They
terminate C-style strings for a reason, use that in your routine. You
don't need to know the lengths, just the endpoints.

>
> while(i <len1)
> {
>
> while( str2[j] == str1[i] )
> {
>
> for(k=1, n=i+1; k<len2; k++, n++)
>
> //n is assigned i, which is where the match //starts in string 1- starting at the next letter
>
> {
> if( str2[k] != str1[n] )
> return 0; //the match fails after having made an initial match
> }
> return 1;
>
> j++;
> }
>
> i++;
> }
>
>
> }
>


Here's one to consider:


int substr(const char *string, const char *substring)
{
const char *a = string;
const char *b = substring;

b = substring;
if (*b == 0)
{
return 1;
}
for ( ; *string != 0; string += 1)
{
if (*string != *b)
{
continue;
}
while (1)
{
if (*b == 0)
{
return 1;
}
if (*a++ != *b++)
{
break;
}
}
}
return 0;
}


Brian Rodenborn
 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      02-20-2004
Default User wrote:

> int substr(const char *string, const char *substring)
> {
> const char *a = string;
> const char *b = substring;
>
> b = substring;


The above line is superfluous and should have been removed when I move
the assignments up to initializers.
Sorry.




Brian Rodenborn
 
Reply With Quote
 
Radhika Sambamurti
Guest
Posts: n/a
 
      02-20-2004



On Fri, 20 Feb 2004 22:16:39 GMT
Default User <(E-Mail Removed)> wrote:

> Radhika Sambamurti wrote:
> >
> > Hi,
> > I've written a substring function.
> > The prototype is: int substr(char s1[], char s2[])
> > Returns 1 if s2 is a substring of s1, else it returns 0.

>
>
> Why? Is this for a school exercise, or self-teaching? The above function
> is almost, but not quite, the same as the C standard function strstr().
>

Thanks! Yes, this was a class exercise.

 
Reply With Quote
 
Jorge Rivera
Guest
Posts: n/a
 
      02-21-2004

>
> These return the starting position of the where the match is found, or a -1
> cast to unsigned int if no match is found.


I know that this is practically irrelevant, but the correct return value
is std::string::npos, not -1.
 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      02-21-2004
Radhika Sambamurti wrote:
>
> On Fri, 20 Feb 2004 22:16:39 GMT
> Default User <(E-Mail Removed)> wrote:
>
> > Radhika Sambamurti wrote:
> > >
> > > Hi,
> > > I've written a substring function.
> > > The prototype is: int substr(char s1[], char s2[])
> > > Returns 1 if s2 is a substring of s1, else it returns 0.

> >
> >
> > Why? Is this for a school exercise, or self-teaching? The above function
> > is almost, but not quite, the same as the C standard function strstr().
> >

> Thanks! Yes, this was a class exercise.


Ok. What you had wasn't too bad, although much more appropriate for a C
class than C++. I'm suspicious of the quality of instruction you are
getting.




Brian Rodenborn
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
improve my substring function? Jeff C Programming 2 05-09-2009 05:30 AM
RegEx search for a substring within a substring colinhumber@gmail.com Perl Misc 3 08-03-2005 04:29 PM
Function to replace multiple occurence of substring in a string Dominique Deleris C Programming 4 02-27-2005 10:19 PM
RE: Isn't there a substring(start, end)-function???? Harvey Thomas Python 0 08-06-2003 01:37 PM
Isn't there a substring(start, end)-function???? Dave Python 3 08-06-2003 01:26 PM



Advertisments