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

Discussion in 'C Programming' started by Steven, Dec 29, 2005.

  1. Steven

    Steven Guest

    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.
    Steven, Dec 29, 2005
    #1
    1. Advertising

  2. Steven

    tmp123 Guest

    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.
    tmp123, Dec 29, 2005
    #2
    1. Advertising

  3. Steven

    Guest

    Steven <> wrote:

    > 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

    --
    :wq
    ^X^Cy^K^X^C^C^C^C
    , Dec 29, 2005
    #3
  4. Steven

    Steven Guest

    On 29 Dec 2005 15:15:36 GMT, wrote:

    > Steven <> wrote:
    >
    > > 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 ?


    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..

    > > 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 ?


    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. :(
    > Ico


    J.
    Steven, Dec 29, 2005
    #4
  5. Steven

    Steven Guest

    On 29 Dec 2005 07:06:34 -0800, "tmp123" <> wrote:

    > 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); */
    }
    Steven, Dec 29, 2005
    #5
  6. Steven

    Guest

    Steven <> wrote:
    > On 29 Dec 2005 15:15:36 GMT, wrote:
    >> Steven <> wrote:
    >>
    >> > 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 ?


    (... 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.

    >> > 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 ?

    >
    > 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 :)

    >> 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.


    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.


    --
    :wq
    ^X^Cy^K^X^C^C^C^C
    , Dec 29, 2005
    #6
  7. Steven

    Guest

    Steven <> wrote:
    >
    > 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 ?

    --
    :wq
    ^X^Cy^K^X^C^C^C^C
    , Dec 29, 2005
    #7
  8. Steven

    tmp123 Guest

    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.
    tmp123, Dec 29, 2005
    #8
  9. Steven

    Chuck F. Guest

    Steven wrote:
    >
    > 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/>
    Chuck F., Dec 29, 2005
    #9
  10. Steven <> writes:
    > 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.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
    Keith Thompson, Dec 29, 2005
    #10
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Greenhorn
    Replies:
    15
    Views:
    814
    Keith Thompson
    Mar 6, 2005
  2. Replies:
    14
    Views:
    675
    Gordon Burditt
    Jul 14, 2006
  3. Raman

    do strcmp support wildcard strings

    Raman, Aug 14, 2007, in forum: C Programming
    Replies:
    4
    Views:
    2,921
    Mark Bluemel
    Aug 15, 2007
  4. Steve555
    Replies:
    8
    Views:
    3,342
    MisterE
    Jan 8, 2009
  5. John Butler
    Replies:
    2
    Views:
    164
    Colin Bartlett
    Jun 3, 2010
Loading...

Share This Page