Connecting Tech Pros Worldwide Forums | Help | Site Map

substring function

Radhika Sambamurti
Guest
 
Posts: n/a
#1: Jul 22 '05
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++;
}


}









Joe C
Guest
 
Posts: n/a
#2: Jul 22 '05

re: substring function



"Radhika Sambamurti" <radhika@schemamania.org> wrote in message
news:20040220152353.3c0d3e87.radhika@schemamania.o rg...[color=blue]
> 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[/color]
this. I am hoping someone can point me to a more elegant way of writing this
same function.[color=blue]
>[/color]

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.


Julie J.
Guest
 
Posts: n/a
#3: Jul 22 '05

re: substring function


How about this:

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

-jj-

Radhika Sambamurti wrote:[color=blue]
>
> 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++;
> }
>
>
> }
>
>
>
>
>
>
>
>[/color]
Default User
Guest
 
Posts: n/a
#4: Jul 22 '05

re: substring function


Radhika Sambamurti wrote:[color=blue]
>
> 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.[/color]


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?
[color=blue]
> 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.[/color]

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

;)
[color=blue]
> 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);[/color]

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.
[color=blue]
>
> 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++;
> }
>
>
> }
>[/color]

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
Default User
Guest
 
Posts: n/a
#5: Jul 22 '05

re: substring function


Default User wrote:
[color=blue]
> int substr(const char *string, const char *substring)
> {
> const char *a = string;
> const char *b = substring;
>
> b = substring;[/color]

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




Brian Rodenborn
Radhika Sambamurti
Guest
 
Posts: n/a
#6: Jul 22 '05

re: substring function





On Fri, 20 Feb 2004 22:16:39 GMT
Default User <first.last@boeing.com.invalid> wrote:
[color=blue]
> Radhika Sambamurti wrote:[color=green]
> >
> > 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.[/color]
>
>
> 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().
>[/color]
Thanks! Yes, this was a class exercise.

Jorge Rivera
Guest
 
Posts: n/a
#7: Jul 22 '05

re: substring function


[color=blue]
>
> These return the starting position of the where the match is found, or a -1
> cast to unsigned int if no match is found.[/color]

I know that this is practically irrelevant, but the correct return value
is std::string::npos, not -1.
Default User
Guest
 
Posts: n/a
#8: Jul 22 '05

re: substring function


Radhika Sambamurti wrote:[color=blue]
>
> On Fri, 20 Feb 2004 22:16:39 GMT
> Default User <first.last@boeing.com.invalid> wrote:
>[color=green]
> > Radhika Sambamurti wrote:[color=darkred]
> > >
> > > 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.[/color]
> >
> >
> > 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().
> >[/color]
> Thanks! Yes, this was a class exercise.[/color]

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
Closed Thread