C言語関係掲示板

過去ログ

No.123.strcmp関数で不等号を使う場合


No.715

strcmp関数で不等号を使う場合
投稿者---DT(2001/12/22 07:07:54)


こんにちわ。最近アルゴリズムの勉強をしています。
昨日は「2分探索木」を勉強しました。
strcmp(A,B==0)は、「AとBは同じ文字列だ」という意味だと知っています。
しかし、下のプログラムで出てくるようなstrcmp(A,B<0)のような
不等号というのは仕組みがよくわかりません。何が何に対して「マイナス」なのでしょうか?(これを言うと等号の場合も何が何に対して「イコール」なのか分かりませんが、、、^^;)。

また、下では if (strcmp(key,a[p].name)<0) 
では「左の枝へ行け」ということですが、
この条件文で比較しているのは文字列ですよね。
いまいち仕組みが理解できないのですが…。
よろしくお願いいたします。

//*2分探索木
#include<stdio.h>
#include<string.h>
#define nil -1
#define Max 100

struct tnode {
int left;
char name [12];
int right ;
};

void main(void)
{
struct tnode a[Max]={{1, "Masao", 2},
{3, "Taro", 4},
{5, "Jiro", nil},
{nil, "Saburo", nil},
{6, "Shiro", 7},
{nil, "Goro", nil},
{nil, "Ponta", nil},
{nil, "Tama", nil}};

char key[100];
int p;

printf("Search name-----> "); scanf("%s", key);

p=0;
while(p!=nil){
if (strcmp(key,a[p].name)==0){
printf("見つかりました\n");
break;
}
else if (strcmp(key,a[p].name)<0)
p=a[p].left;
else
p=a[p].right;
 }
}


No.716

Re:strcmp関数で不等号を使う場合
投稿者---HAO(2001/12/22 11:04:11)


strcmpは大抵以下のような形で実装されていると思いますが

int strcmp(char* p, char* q) {
 int r;
 do {
  if(r = *p - *q++)
   return r;
 } while(*p++);
 return 0;
}

No.717

Re:strcmp関数で不等号を使う場合
投稿者---B.Smith(2001/12/22 15:10:21)


数値の比較を行う場合、
    cmp =  - 

,諒が△茲蠅眤腓い時は引き算の結果は正となります。逆の場合は負となり、一致した場合はゼロになります。strcmpも考え方は同じで、違いは比較対照が文字列であるということだけです。

strcmp(またはmemcmp)は文字列の先頭から比較していきます。双方の文字同士を比較(引き算)し、文字コードが一致しなかった場合、その時点で比較を中止し減算値を返します。このため、例えばStr1とStr2を比較した場合、
    ・Str1 > Str2の時、戻り値は正になる
    ・Str1 < Str2の時、戻り値は負になる

ということになります。
どちらかの文字列が短かった場合、末尾ヌルとの減算になりますので、文字列の長い方が「大きな文字列」ということになります。
すべての文字が一致している場合はゼロを返します。

例えば、以下のような文字列を比較したとします。
    (1) "ABCDE"
    (2) "ABDEF"

この場合、3番目の文字が'C'と'D'なので、(2)の方が大きい文字列である、ということになります。
文字列の長さが違う場合、
    (3) "1234567"
    (4) "12345"

この場合は、(3)の'6'と(4)のヌルの減算となりますので、(3)の方が大きい文字列である、ということになります。

これらのことから、strcmpは文字列をアルファベット順(文字コード順)で見て比較していると言えます。
以下の例では、文字列テーブルTestの内容を昇順(アルファベット順)に並び替えます。

使用例.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define     DATA_CNT    (sizeof(Test ) / sizeof(char *))

typedef int     (*COMP)(const void *,const void *);
int     Compare(char **,char **);

void main(void )
{
    char    *Test[] = {"GHI", "DEF", "ABC"};
    int     Idx;

    qsort(Test,DATA_CNT,sizeof(char *),(COMP )Compare);

    for(Idx = 0;Idx < DATA_CNT;Idx++)
        printf("%s\n",Test[Idx]);
}

int     Compare(char **ptr1,char **ptr2)
{
    return strcmp(*ptr1,*ptr2);
}


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved