int namecmp(char *str1, int len1, char *str2, int len2)
{
int leng, result;
if (len1 == -1) return 1;
if (len2 == -1) return -1;
leng = (len1 < len2) ? len1 : len2;・・・A
result = strncmp(str1, str2, leng);・・・B
if (result == 0)・・・C
result = len1 - len2;・・・D
return result;
}
・len1=デスクトップPCでの名前の文字数/len2=ノートPCでの名前の文字数
例えば、デスクトップPCでの名前が“C_is_Best”、ノートPCが“C_is”だったとします。
(同じ人でも苗字だけとフルネームがありますよね?)
この時、共通文字列を見つけるために、Aの処理で、文字数の少ない方を選定します。
ここでは、“C_is_Best”>“C_is”ですから、“C_is”と言う共通部分文字数が取得できました。
(leng は共通部分文字数ですから“C_is”は4文字で、leng=4 です)
Bで共通部分が完全に同じ文字列、つまり同名かを判定します。
・デスクトップでの名前とノートでの名前が同じ = 0
・デスクトップでの名前の文字コードが大きい = 1
・ノートでの名前の文字コードが大きい = -1
※Bは各1文字を左から終端まで調べ、すべて同じ文字コードなら 0、
ある所で、str1 内の文字コード>str2 内の文字コードなら 1、
ある所で、str1 内の文字コード<str2 内の文字コードなら -1 です。
"1">"0" (49>48 ですね)"1234"<"134" (49=49 / 50<51) で決まりですね。
Cで共通部分が(“C_is”)が確定したので、Dの処理です。
そもそも、namecmp 関数は、共通部分の名前を返したいので、
(つまり少ない文字数の方を元のaddrsync 関数に知らせます)
元の addrsync 関数の分岐処理のために、
1.デスクトップでの名前(len1)とノートでの名前(len2)が同じ … 0
2.デスクトップでの名前(len1)の文字数が多い … 0 より大きい
3.ノートでの名前(len2)の文字数が多い … 0 より小さい
を返させます。
この3つの条件を満たすのは result = len1 - len2 だけです。
1.同じ文字数を引けば0で2つの名前は完全に同じです。
2.例で言えば“C_is_Best”>“C_is”が、9文字 > 4文字 ですから、9-4=0より大きい為
元の addrsync 関数は0より大きくノートの名前を使うので結果、
少ない方の文字を知らせることができました。
3.例で言えば逆に“C_is”<“C_is_Best”だったら、4文字 < 9文字 ですから、4-9=0より小さい為
元の addrsync 関数は0より小さくデスクトップの名前を使うので結果、
少ない方の文字を知らせることができました。
尚、result = (len1 < len2) ? len1 : len2
では、0の同名だけを抽出できません。
とにかく、引き算して、0になるか、1以上か、-1以下の条件材料と認識すれば
OKです。
お礼
名前が途中まで一致するというケースが思い浮かびませんでした 理解できました