2022年6月14日星期二

C memcmp

int memcmp(const void *string1, const void *string2, size_t n);

從兩個記憶體位址開始,比對n個bytes進行比較(維基百科的翻譯)
操作過後,覺得那樣的講法有問題,應該要改成,從兩個記憶體開始的地方取n個依序進行比較,如果發現不同時,會進行該位址的數值大小比對,依據結果回傳0,-1,1
https://www.ibm.com/docs/en/zos/2.4.0?topic=programs-memcmp-compare-bytes
IBM的描述比較清楚,主要是從個別的起始位址開始依序比較n個數值大小,直到n結束時,若無發現不同時回傳0。發現第一個不同時,在比較該不同的位址的數值,哪個數值大。
 0: 完全相同
 1: string1> string2 (發現不同的地方數值是string1> string2)

-1: string1< string2 (發現不同的地方數值是string1< string2)


1. 以相同的字串進行比對

  1. /*This file use to record string.h library use */
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5.  
  6. int main()
  7. {
  8. char str1[10]="Hello\n";
  9. char str2[10]="Hello\n";
  10.  
  11. printf("%d\n",memcmp(str1,str2,3));//取三個比較,看判定結果
  12. return 0;
  13. }

    我們在字串1與字串2相同時,可以看到回傳結果為0。

2. 修改第三個字元比對

  1. /*This file use to record string.h library use */
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. int main()
  6. {
  7. char str1[10]="Hello\n";
  8. char str2[10]="HeAlo\n";
  9.  
  10. printf("%d\n",memcmp(str1,str2,3)); //修改Str2第三個字元,取各前三個比較,看判定結果
  11.  
  12. return 0;
  13. }


    我們修改str2中第三個字元為A與Str1比較,可以看到回傳結果為1

3. 交換第三個字元比對

  1. /*This file use to record string.h library use */
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. int main()
  6. {
  7. char str1[10]="HeAlo\n";
  8. char str2[10]="Hello\n";
  9.  
  10. printf("%d\n",memcmp(str1,str2,3)); //交換第三個字元,取三個比較,看判定結果
  11.  
  12. return 0;
  13. }


    這個時後會發現,為甚麼只是交換位置,怎麼回傳就不一樣?這個時後我們拿出ASCII 表出來看,可以發現’A’代表的十進制為65,而’l’為108,比較之後發現65<108所以回傳-1

沒有留言:

發佈留言

打賞按讚