substring function | | |
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++;
}
} | | | | 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. | | | | 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] | | | | 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 | | | | 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 | | | | 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. | | | | 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. | | | | 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 |  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,449 network members.
|