strcmp() question, 4 words, two strings, equal return value.

S

Steven

Hello,

I have a question about strcmp(). I have four words, who need to be
compared if it were two strings. I tried adding the comparison values
like '(strcmp(w1, w2) + strcmp(w3, w4))', where w1 and w2 make up the
first string and, w3 and w4 make up the second string. I do not want
to allocate memory, then put the words together to create a string
only to facilitate strcmp() comparison.

My question; Does anyone know how to get the same strcmp() return
value I would normally get when comparing the four words like if they
were two strings ?

Thank you.

Steven.
 
T

tmp123

Hi,

In a generic way, the following expression could help (not tested):

int x;
....
((x=strcmp(w1,w2))!=0)? x : strcmp(w3,w4)

However, in your question is not clear what do you expect about
different lengths of strings.

Kind regards.
 
U

usenet

Steven said:
I have a question about strcmp(). I have four words, who need to be
compared if it were two strings. I tried adding the comparison values
like '(strcmp(w1, w2) + strcmp(w3, w4))',

Why were you trying that ?
where w1 and w2 make up the first string and, w3 and w4 make up the second
string. I do not want to allocate memory, then put the words together to
create a string only to facilitate strcmp() comparison.

My question; Does anyone know how to get the same strcmp() return
value I would normally get when comparing the four words like if they
were two strings ?

Just to make sure: is this a homework assignment ?

The solution should not be too complicated; start with comparing the first
halves of both strings, and figure out in which cases this first comparison
tells you enough about the two strings being the same or different, and in
which case you would have to do some more strcmp()'ing.

Ico
 
S

Steven

Why were you trying that ?

Because I have two binary trees. One which holds all the actual data
e.g. uniq words and their frequencies. The second binary tree consists
of nodes who hold two pointers to the word freq's. Those two words
make up a bigram.

So basicly a binary tree of pointers that is linked with another
binary tree which holds the actual data. That way only uniq words are
saved and not the whole input amount and for each word only two mem
alloc's & free's have to be made. [one for the node, one for the
word].

The only trade-off is that a seperate function has to be coded to
create & install a tree that only consists of pointers. That is why I
need that strcmp() because two pointers arrive to nodes which hold the
actual data. A normal treeadd() function, but instead of one word, two
pointers to other nodes have to be added.

I hope it is a bit clear..
Just to make sure: is this a homework assignment ?

Owww. thank you for the compliment, it's been at least 20 years since
someone asked me that :) I am going to brag about this to my wife
tonight...
The solution should not be too complicated; start with comparing the first
halves of both strings, and figure out in which cases this first comparison
tells you enough about the two strings being the same or different, and in
which case you would have to do some more strcmp()'ing.

I thought of that in the first moment of the problem. But.. You will
always have to compare all words since you never know in advance how
much both the second words from the string will differ. In my case
that would create an crippeld unbalanced tree since the strcmp() value
is used to index it.

Just comparing w1 and w2, w3 and w4; and then adding the resulting
values to come to the comaprison value unfortunatly does not work. :(

J.
 
S

Steven

Hi,

In a generic way, the following expression could help (not tested):

int x;
...
((x=strcmp(w1,w2))!=0)? x : strcmp(w3,w4)

However, in your question is not clear what do you expect about
different lengths of strings.

To return the same value by strcmp() when comparing the four words as
if it were two full strings.
Kind regards.

Thank you for the quick solution. At first glance this would work,
however when the two strings are equal, it does not return zero. See
the last output.

Thanks.

Steven.

#include <stdio.h>
#include <string.h>

int mystrcmp(const char *w1, const char *w2, const char *w3, const
char *w4);

int main(void) {
int x = 0;
char *stra = "jasondonovan";
char *strb = "kristalclear";
char *w1 = "jason";
char *w2 = "donovan";
char *w3 = "kristal";
char *w4 = "clear";

printf("1. %d\n", strcmp(stra, strb));

((x = strcmp(w1, w2)) != 0) ? x : strcmp(w3, w4);

printf("2. %d\n", x);
printf("3. %d\n", mystrcmp(w1, w2, w3, w4));
printf("4. %d\n", mystrcmp("first", "second", "first", "second"));

return 0;
}

int mystrcmp(const char *w1, const char *w2, const char *w3, const
char *w4) {
int x = 0;

if((x = strcmp(w1, w2)) != 0)
return x;
else
return strcmp(w3, w4);

/* ((x = strcmp(w1, w2)) != 0) ? x : strcmp(w3, w4); */
}
 
U

usenet

(... explanation about binary tree application ...)
I hope it is a bit clear..

A bit, yes :)

But (strcmp(w1, w2) + strcmp(w3, w4)) will not do what you want, will it ?

As far as I know strcmp() will only tell you if a string is bigger, equal or
smaller then another string by returning <0, ==0 or >0, but the magnitude
(if that's the right word) of the return value is not defined. If "foo" is
bigger then "bar", it could return +1, MAXINT or any other positive number.
I believe adding the return values of two strcmp()'s does not give
meaningful results.
Owww. thank you for the compliment, it's been at least 20 years since
someone asked me that :) I am going to brag about this to my wife
tonight...

Hehe, sorry for asking, but lack of context *is* suspicious, after all :)
I thought of that in the first moment of the problem. But.. You will
always have to compare all words since you never know in advance how
much both the second words from the string will differ.

I'm not sure if you always have to compare all words, but maybe I still
don't understand your problem thoroughly.

You have four words: w1, w2, w3, w4. Those four words make up two strings : s1
which is the concatination of w1 and w2, and s2 which is the concatination
of w3 and w4.

Compare the first two halves of s1 and s2, which would be w1 and w3. If the
lengths differ, you only strncmp() up to the length of the shortest of the
two. If these two don't match, there would be no need to do any more
comparing. If they *do* match, you would have to do more comparing after
that.
 
U

usenet

Steven said:
Thank you for the quick solution. At first glance this would work,
however when the two strings are equal, it does not return zero. See
the last output.

(...)

int mystrcmp(const char *w1, const char *w2, const char *w3, const char *w4)
{
int x = 0;

if((x = strcmp(w1, w2)) != 0)
return x;
else
return strcmp(w3, w4);

/* ((x = strcmp(w1, w2)) != 0) ? x : strcmp(w3, w4); */
}

I think things are mixed up here. Didn't you mean to compare w1 to w3 and w2
to w4 ?
 
T

tmp123

Hi,

As has been said by another poster, there are a small confusion on the
usage of w1,...w4.

For the naming order you give in the example, the correct expresion is:
((x = strcmp(w1, w3)) != 0) ? x : strcmp(w2, w4);

Another question is the expected answer in case of full strings are
equal, but partial not:

char *stra = "jasondonovan";
char *strb = "jasondonovan";
char *w1 = "jason";
char *w2 = "donovan";
char *w3 = "jasondo";
char *w4 = "novan";

Kind regards.
 
C

Chuck F.

Steven said:
I have a question about strcmp(). I have four words, who need to
be compared if it were two strings. I tried adding the
comparison values like '(strcmp(w1, w2) + strcmp(w3, w4))',
where w1 and w2 make up the first string and, w3 and w4 make up
the second string. I do not want to allocate memory, then put
the words together to create a string only to facilitate
strcmp() comparison.

My question; Does anyone know how to get the same strcmp()
return value I would normally get when comparing the four words
like if they were two strings ?

#include <string.h>

int twowordcompare(char *w1, char *w2, /* 1st pair */
char *w3, char *w4) /* 2nd pair */
{
int result;

if (0 == (result = strcmp(w1, w3)))
result = strcmp(w2, w4));
return result;
}

(which assumes the compound comparands are always split in the same
places).

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson
More details at: <http://cfaj.freeshell.org/google/>
 
K

Keith Thompson

Steven said:
I have a question about strcmp(). I have four words, who need to be
compared if it were two strings. I tried adding the comparison values
like '(strcmp(w1, w2) + strcmp(w3, w4))', where w1 and w2 make up the
first string and, w3 and w4 make up the second string. I do not want
to allocate memory, then put the words together to create a string
only to facilitate strcmp() comparison.

My question; Does anyone know how to get the same strcmp() return
value I would normally get when comparing the four words like if they
were two strings ?

You need to define the problem more precisely. You say you have "four
words"; I presume you have a pointer to each word, which is stored as
a string (w1, w2, w3, w4), so strcmp(w1, w2) would compare the first
and second words. So far, that's clear enough.

You then say you need to compare the four words "as if it were two
strings". Well, they're not two strings, they're four strings. There
are a multitude of ways you could treat them "as if" they were two
strings.

The first thing you should do is define precisely, in English, just
what you're looking for. Once you've done that, you can nail down
your definition by writing something in C that's functionally what you
want, but not necessarily as efficient as you want it.

Here's an example of what you *might* mean:

int compare(char *w1, char *w2, char *w3, char *w4)
{
char *s1 = malloc(strlen(w1) + strlen(w2) + 1);
char *s2 = malloc(strlen(w3) + strlen(w4) + 1);
int result;
if (s1 == NULL || s2 == NULL) {
/* Insert error handling here. */
}
strcpy(s1, w1);
strcat(s1, w2);
strcpy(s2, w3);
strcat(s2, w4);
result = strcmp(s1, s2);
free(s1);
free(s2);
return result;
}

If C supported "+" as a string concatenation operator, this would be
equivalent to strcmp(w1+w2, w3+w4). That may or may not be what you
want. Since you refer to the input strings as "words", it might also
make sense to concatenate them together with a space between them.

Finally, *why* don't you want to "allocate then put the words together
to create a string only to facilitate strcmp() comparison"? If I
understand your problem statement correctly, that seems like the most
obvious way to approach the problem. If you're worried about
efficiency, and you'd rather compare the strings in place, that's
reasonable, but you should consider getting something working first,
then worry later about making it more efficient. You might find that
the allocation isn't a bottleneck, and optimizing that code might not
be worth the effort. On the other hand, if that is a bottleneck,
there are probably ways to write a strcmp() replacement that traverses
pairs of strings rather than single strings.

Describe more precisely what you're trying to do, and perhaps we can
help you do it.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top