• ベストアンサー

平成12年秋 午後問7(二つのアドレス帳同期)

e:ウ result = len1 - len2 の理由を教えてください

質問者が選んだベストアンサー

  • ベストアンサー
noname#50176
noname#50176
回答No.1

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です。

C_is_Best
質問者

お礼

名前が途中まで一致するというケースが思い浮かびませんでした 理解できました

すると、全ての回答が全文表示されます。

関連するQ&A