亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

C標準庫源碼解剖(4):字符串處理函數string.h和wchar.h

2024-07-10 13:27:16
字體:
來源:轉載
供稿:網友

 string.h中包含了所有的字符串處理函數,也包含了內存處理函數,因為這些內存處理函數(如比如、復制、搜索)的功能與字符串處理函數功能類似。我們是用通用指針來指向內存塊的,通用指針可以用char*類型(傳統C語言),也可以用void*類型(標準C語言)。每個函數都有對應的寬字符版本,在wchar.h中。
    string.h中包含的標準庫函數:strcat,strncat,strcmp,strncmp,strcpy,strncpy,strlen,strchr,strrchr,strspn,strcspn,strpbrk, strstr,strok,strcoll,strxfrm,strerror; memcpy,memmove,memcmp,memchr,memeset。GNU還提供了很多非標準的擴展,如memccpy,rawmemchr,memrchr, strdup,strndup等。

 

[cpp] view plaincopy
  1. /* ISO C99 Standard: 7.21 字符串處理 <string.h> */  
  2. #ifndef _STRING_H  
  3. #define _STRING_H   1  
  4. #include <features.h> /* 非標準頭文件,定義了一些編譯選項 */  
  5. __BEGIN_DECLS  
  6. /* 從<stddef.h>中獲得size_t和NULL  */  
  7. #define __need_size_t  
  8. #define __need_NULL  
  9. #include <stddef.h>  
  10. __BEGIN_NAMESPACE_STD  
  11. /* 從SRC中復制N個字節的內容到DEST中  */  
  12. extern void *memcpy (void *__restrict __dest,  
  13.              __const void *__restrict __src, size_t __n)  
  14.      __THROW __nonnull ((1, 2));  
  15. /* 從SRC中復制N個字節的內容到DEST中,保證對重疊字符串(即SRC與DEST共用存儲空間)有正確的行為 */  
  16. extern void *memmove (void *__dest, __const void *__src, size_t __n)  
  17.      __THROW __nonnull ((1, 2));  
  18. __END_NAMESPACE_STD  
  19. /* 從SRC中復制不超過N個字節的內容到DEST中,當遇到字符C時便停止,返回DEST中C的拷貝后面的字符指針。 
  20.     如果在SRC的前面N個字節中沒有發現字符C,則返回NULL */  
  21. #if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN  
  22. extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,  
  23.               int __c, size_t __n)  
  24.      __THROW __nonnull ((1, 2));  
  25. #endif /* SVID.  */  
  26. __BEGIN_NAMESPACE_STD  
  27. /* 把S的前N個字節的內容設置為C */  
  28. extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));  
  29. /* 比較S1和S2的前n字節的內容 */  
  30. extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)  
  31.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  32. /* 在S的前N個字節中搜索C的第一次出現  */  
  33. extern void *memchr (__const void *__s, int __c, size_t __n)  
  34.       __THROW __attribute_pure__ __nonnull ((1));  
  35. __END_NAMESPACE_STD  
  36. #ifdef __USE_GNU  
  37. /* 在S中搜索C,這與“memchr”類似,但這里沒有長度的限制 */  
  38. extern void *rawmemchr (__const void *__s, int __c)  
  39.      __THROW __attribute_pure__ __nonnull ((1));  
  40. /* 在S的前N個字節中搜索C的最后一次出現  */  
  41. extern void *memrchr (__const void *__s, int __c, size_t __n)  
  42.       __THROW __attribute_pure__ __nonnull ((1));  
  43. #endif  
  44. __BEGIN_NAMESPACE_STD  
  45. /* 將SRC復制到DEST中  */  
  46. extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)  
  47.      __THROW __nonnull ((1, 2));  
  48. /* 將SRC的前N個字符復制到DEST  */  
  49. extern char *strncpy (char *__restrict __dest,  
  50.               __const char *__restrict __src, size_t __n)  
  51.      __THROW __nonnull ((1, 2));  
  52. /* 將SRC追加到DEST */  
  53. extern char *strcat (char *__restrict __dest, __const char *__restrict __src)  
  54.      __THROW __nonnull ((1, 2));  
  55. /* 將SRC的前N個字符追加到DEST */  
  56. extern char *strncat (char *__restrict __dest, __const char *__restrict __src,  
  57.               size_t __n) __THROW __nonnull ((1, 2));  
  58. /* 比較S1和S2 */  
  59. extern int strcmp (__const char *__s1, __const char *__s2)  
  60.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  61. /* 比較S1和S2的前N個字符 */  
  62. extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)  
  63.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  64. /* 比較S1和S2對照后的形式(即按特定區域設置來進行字符排序) */  
  65. extern int strcoll (__const char *__s1, __const char *__s2)  
  66.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  67. /* 對SRC作轉換并放到DEST的前N個字節中 */  
  68. extern size_t strxfrm (char *__restrict __dest,  
  69.                __const char *__restrict __src, size_t __n)  
  70.      __THROW __nonnull ((2));  
  71. __END_NAMESPACE_STD  
  72. #ifdef __USE_GNU  
  73. /* 下面的函數與上面的兩個等價,但它們帶一個額外的區域設置參數,用于設置字符對照規則。 
  74.     這是非標準的函數,但是在不久之后有可能會被標準化 */  
  75. # include <xlocale.h>  
  76. /* 使用L中的規則來比較S1和S2對照后的形式 */  
  77. extern int strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)  
  78.      __THROW __attribute_pure__ __nonnull ((1, 2, 3));  
  79. /* 對SRC作轉換并放到DEST的前N個字節中 */  
  80. extern size_t strxfrm_l (char *__dest, __const char *__src, size_t __n,  
  81.              __locale_t __l) __THROW __nonnull ((2, 4));  
  82. #endif  
  83. #if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED  
  84. /* 復制S,返回一個相同的副本 */  
  85. extern char *strdup (__const char *__s)  
  86.      __THROW __attribute_malloc__ __nonnull ((1));  
  87. #endif  
  88. /* 返回STRING的前N個字節的副本。即使STRING[N]前面沒有出現終止符, 
  89.     結果字符串也會被終止 */  
  90. #if defined __USE_GNU  
  91. extern char *strndup (__const char *__string, size_t __n)  
  92.      __THROW __attribute_malloc__ __nonnull ((1));  
  93. #endif  
  94. #if defined __USE_GNU && defined __GNUC__  
  95. /* 復制S,返回一個相同的副本 */  
  96. # define strdupa(s)                               /  
  97.   (__extension__                                  /  
  98.     ({                                        /  
  99.       __const char *__old = (s);                          /  
  100.       size_t __len = strlen (__old) + 1;                      /  
  101.       char *__new = (char *) __builtin_alloca (__len);                /  
  102.       (char *) memcpy (__new, __old, __len);                      /  
  103.     }))  
  104. /* 返回字符串前N個字節的副本 */  
  105. # define strndupa(s, n)                               /  
  106.   (__extension__                                  /  
  107.     ({                                        /  
  108.       __const char *__old = (s);                          /  
  109.       size_t __len = strnlen (__old, (n));                    /  
  110.       char *__new = (char *) __builtin_alloca (__len + 1);            /  
  111.       __new[__len] = '/0';                            /  
  112.       (char *) memcpy (__new, __old, __len);                      /  
  113.     }))  
  114. #endif  
  115. __BEGIN_NAMESPACE_STD  
  116. /* 在S中搜索C的第一次出現 */  
  117. extern char *strchr (__const char *__s, int __c)  
  118.      __THROW __attribute_pure__ __nonnull ((1));  
  119. /* 在S中搜索C的最后一次出現  */  
  120. extern char *strrchr (__const char *__s, int __c)  
  121.      __THROW __attribute_pure__ __nonnull ((1));  
  122. __END_NAMESPACE_STD  
  123. #ifdef __USE_GNU  
  124. /* 這個函數與“strchr”類似,但如果在S中沒有找到C,則它返回一個指向NUL終止符的指針 */  
  125. extern char *strchrnul (__const char *__s, int __c)  
  126.      __THROW __attribute_pure__ __nonnull ((1));  
  127. #endif  
  128. __BEGIN_NAMESPACE_STD  
  129. /* 返回S中的第一個子串長度,這個子串的所有字符都不在REJECT中 */  
  130. extern size_t strcspn (__const char *__s, __const char *__reject)  
  131.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  132. /* 返回S中的第一個子串長度,這個子串的所有字符都在ACCEPT中 */  
  133. extern size_t strspn (__const char *__s, __const char *__accept)  
  134.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  135. /* 返回S中的第一個在ACCEPT中出現的字符指針 */  
  136. extern char *strpbrk (__const char *__s, __const char *__accept)  
  137.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  138. /* 查找字符串NEEDLE在HAYSTACK中第一次出現  */  
  139. extern char *strstr (__const char *__haystack, __const char *__needle)  
  140.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  141. /* 用DELIM中的字符作為分隔符把S解析成多個記號 */  
  142. extern char *strtok (char *__restrict __s, __const char *__restrict __delim)  
  143.      __THROW __nonnull ((2));  
  144. __END_NAMESPACE_STD  
  145. /* 用DELIM中的字符作為分隔符把S分解為多個記號,上一次調用的信息存儲在SAVE_PTR中 */  
  146. extern char *__strtok_r (char *__restrict __s,  
  147.              __const char *__restrict __delim,  
  148.              char **__restrict __save_ptr)  
  149.      __THROW __nonnull ((2, 3));  
  150. #if defined __USE_POSIX || defined __USE_MISC  
  151. extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,  
  152.                char **__restrict __save_ptr)  
  153.      __THROW __nonnull ((2, 3));  
  154. #endif  
  155. #ifdef __USE_GNU  
  156. /* 與“strstr”類似,但這個函數忽略字符串的大小寫 */  
  157. extern char *strcasestr (__const char *__haystack, __const char *__needle)  
  158.      __THROW __attribute_pure__ __nonnull ((1, 2));  
  159. #endif  
  160. #ifdef __USE_GNU  
  161. /* 在HAYSTACK中查找NEEDLE的第一次出現。NEEDLE為NEEDLEN個字節長, 
  162.     HAYSTACK為HAYSTACKLEN個字節長 */  
  163. extern void *memmem (__const void *__haystack, size_t __haystacklen,  
  164.              __const void *__needle, size_t __needlelen)  
  165.      __THROW __attribute_pure__ __nonnull ((1, 3));  
  166. /* 將SRC的N個字節復制到DEST,返回最后一個寫入字節后面位置的指針 */  
  167. extern void *__mempcpy (void *__restrict __dest,  
  168.             __const void *__restrict __src, size_t __n)  
  169.      __THROW __nonnull ((1, 2));  
  170. extern void *mempcpy (void *__restrict __dest,  
  171.               __const void *__restrict __src, size_t __n)  
  172.      __THROW __nonnull ((1, 2));  
  173. #endif  
  174. __BEGIN_NAMESPACE_STD  
  175. /* 返回S的長度 */  
  176. extern size_t strlen (__const char *__s)  
  177.      __THROW __attribute_pure__ __nonnull ((1));  
  178. __END_NAMESPACE_STD  
  179. #ifdef  __USE_GNU  
  180. /* 查找STRING的長度,但只掃描前MAXLEN個字符,如果其中沒有發現'/0'終止符,則返回MAXLEN */  
  181. extern size_t strnlen (__const char *__string, size_t __maxlen)  
  182.      __THROW __attribute_pure__ __nonnull ((1));  
  183. #endif  
  184. __BEGIN_NAMESPACE_STD  
  185. /* 返回對錯誤碼ERRNUM的字符串描述  */  
  186. extern char *strerror (int __errnum) __THROW;  
  187. __END_NAMESPACE_STD  
  188. /* 下面都是非標準擴展或內部使用的函數 */  
  189. __END_DECLS  
  190. #endif /* string.h  */  

    1、字符串連接strcat,strncat,wcscat,wcsncat:將字符串src(或其前n個字符)連接到dest,后面兩個是寬字符版本。

 

 

[cpp] view plaincopy
  1. /* strcat.c:strcat函數的實現  */  
  2. #include <string.h>  
  3. #include <memcopy.h> /* 非標準頭文件,定義了reg_char類型 */  
  4. #undef strcat  
  5. /* 將字符串SRC連接到DEST */  
  6. char *  
  7. strcat (dest, src)  
  8.      char *dest;  
  9.      const char *src;  
  10. {  
  11.   char *s1 = dest;  
  12.   const char *s2 = src;  
  13.   reg_char c; /* reg_char在memcopy.h中定義,就是char類型,它表示c存儲在register中 */  
  14.     
  15.   do    /* 讓s1指向dest的終止位置,即首個'/0'的下一位置  */  
  16.     c = *s1++;  
  17.   while (c != '/0');  
  18.   s1 -= 2; /* 讓s1指向dest中的終止符'/0'的前一個位置,這樣就可以進行連接操作了 */  
  19.   do     /* 做連接操作 */  
  20.     {  
  21.       c = *s2++;  
  22.       *++s1 = c;  
  23.     }  
  24.   while (c != '/0');  
  25.   return dest;  
  26. }  
  27. libc_hidden_builtin_def (strcat)  

 

 

[cpp] view plaincopy
  1. /* strncat.c:strncat函數的實現 */  
  2. #include <string.h>  
  3. #ifdef _LIBC  
  4. # include <memcopy.h> /* 非標準頭文件,定義了reg_char類型,就是char類型 */  
  5. #else  
  6. typedef char reg_char;  
  7. #endif  
  8. #undef strncat  
  9. /* 將s2的前n個字符連接到s1,若s2不足n個字符,則連接完s2(包括終止符)后 
  10.     就返回 */  
  11. char *  
  12. strncat (s1, s2, n)  
  13.      char *s1;  
  14.      const char *s2;  
  15.      size_t n;  
  16. {  
  17.   reg_char c;  
  18.   char *s = s1;  
  19.   do  /* 讓s1指向dest的終止位置,即首個'/0'的下一位置  */  
  20.     c = *s1++;  
  21.   while (c != '/0');  
  22.   s1 -= 2; /* 讓s1指向dest中的終止符'/0'的前一個位置,這樣就可以進行連接操作了 */  
  23.   if (n >= 4)      /* 做連接操作,每4個字符作為一組來進行連接 */  
  24.     {  
  25.       size_t n4 = n >> 2; /* 讓n除以4,計算出循環次數 */  
  26.       do  
  27.     {  
  28.       c = *s2++;     /* 每次循環都要連接4個字符,總共連接了4*n4個字符 */  
  29.       *++s1 = c;  
  30.       if (c == '/0'/* 在連接時,每當遇到'/0',連接操作就停止,并返回目標串 */  
  31.         return s;  
  32.       c = *s2++;  
  33.       *++s1 = c;  
  34.       if (c == '/0')  
  35.         return s;  
  36.       c = *s2++;  
  37.       *++s1 = c;  
  38.       if (c == '/0')  
  39.         return s;  
  40.       c = *s2++;  
  41.       *++s1 = c;  
  42.       if (c == '/0')  
  43.         return s;  
  44.     } while (--n4 > 0);  
  45.       n &= 3; /* 求出n除以4的余數 */  
  46.     }  
  47.   while (n > 0) /* 對剩下的幾個字符(最多3個)進行連接 */  
  48.     {  
  49.       c = *s2++;  
  50.       *++s1 = c;  
  51.       if (c == '/0')  
  52.     return s;  
  53.       n--;  
  54.     }  
  55.   if (c != '/0')  /* 如果末尾不是終止符,則要補上一個終止符 */  
  56.     *++s1 = '/0';  
  57.   return s;  
  58. }  

 

    解釋:
    (1)strcat基本思想:把指針移到dest的終止符'/0'的前一個位置,然后掃描src的每個字符并連接到dest的后面。
    (2)strncat基本思想:為減少掃描的循環次數以提高效率,對src的每4個字符作為一組來進行連接,讓n除以4,計算出循環次數n4。每次循環都要連接4個字符,總共連接了4*n4個字符,最后對剩下的幾個字符(最多3個)進行連接。若src的第n個字符不是終止符'/0',則連接的末尾還要補上一個終止符。
    2、字符串比較strcmp,strncmp,wcscmp,wcsncmp:按照字典順序比較兩個字符串(或其前n個字符)的大小。

 

[cpp] view plaincopy
  1. /* strcmp.c:strcmp函數的實現  */  
  2. #include <string.h>  
  3. #include <memcopy.h>  /* 非標準頭文件,定義了reg_char類型 */  
  4. #undef strcmp  
  5. /* 比較S1和S2,小于返回小于0的數,等于時返回0,大于時返回大于0的數 */  
  6. int  
  7. strcmp (p1, p2)  
  8.      const char *p1;  
  9.      const char *p2;  
  10. {  
  11.   register const unsigned char *s1 = (const unsigned char *) p1;  
  12.   register const unsigned char *s2 = (const unsigned char *) p2;  
  13.   unsigned reg_char c1, c2;  
  14.   do  
  15.     {  
  16.       c1 = (unsigned char) *s1++;  
  17.       c2 = (unsigned char) *s2++;  
  18.       if (c1 == '/0')  /* 若s1終止,則比較結束,返回相應差值 */  
  19.     return c1 - c2;  
  20.     }  
  21.   while (c1 == c2); /* 做相等比較,直到不相等時退出循環 */  
  22.   return c1 - c2;  /* 返回相應的差值 */  
  23. }  
  24. libc_hidden_builtin_def (strcmp)  

 

 

[cpp] view plaincopy
  1. /* strncmp.c:strncmp函數的實現 */  
  2. #include <string.h>  
  3. #include <memcopy.h>  
  4. #undef strncmp  
  5. /* 比較s1和s2的前n個字符,不足n個字符時使用整個字符串, 
  6.     小于返回小于0的數,等于時返回0,大于時返回大于0的數 */  
  7. int  
  8. strncmp (s1, s2, n)  
  9.      const char *s1;  
  10.      const char *s2;  
  11.      size_t n;  
  12. {  
  13.   unsigned reg_char c1 = '/0';  
  14.   unsigned reg_char c2 = '/0';  
  15.   if (n >= 4)      /* 做比較操作,每4個字符作為一組來進行比較 */  
  16.     {  
  17.       size_t n4 = n >> 2;  /* 做比較操作,每4個字符作為比較來進行連接 */  
  18.       do  
  19.     {  
  20.       c1 = (unsigned char) *s1++; /* 每次循環都要比較4個字符,總共比較了4*n4個字符 */  
  21.       c2 = (unsigned char) *s2++;  
  22.       if (c1 == '/0' || c1 != c2)/* 每當遇到s1終止或c1!=c2,比較操作就結束,并返回相應差值 */  
  23.         return c1 - c2;  
  24.       c1 = (unsigned char) *s1++;  
  25.       c2 = (unsigned char) *s2++;  
  26.       if (c1 == '/0' || c1 != c2)  
  27.         return c1 - c2;  
  28.       c1 = (unsigned char) *s1++;  
  29.       c2 = (unsigned char) *s2++;  
  30.       if (c1 == '/0' || c1 != c2)  
  31.         return c1 - c2;  
  32.       c1 = (unsigned char) *s1++;  
  33.       c2 = (unsigned char) *s2++;  
  34.       if (c1 == '/0' || c1 != c2)  
  35.         return c1 - c2;  
  36.     } while (--n4 > 0);  
  37.       n &= 3;  /* 求出n除以4的余數 */  
  38.     }  
  39.   while (n > 0) /* 對剩下的幾個字符(最多3個)進行比較 */  
  40.     {  
  41.       c1 = (unsigned char) *s1++;  
  42.       c2 = (unsigned char) *s2++;  
  43.       if (c1 == '/0' || c1 != c2)  /* 若s1終止或c1!=c2,則比較結束,返回相應差值 */  
  44.     return c1 - c2;  
  45.       n--;  
  46.     }  
  47.   return c1 - c2;  /* 返回相應差值 */  
  48. }  
  49. libc_hidden_builtin_def (strncmp)  

 

    解釋:
    (1)strcmp基本思想:掃描兩個串,并對字符作相等比較,直到不相等時退出循環,返回這兩個字符的差值。
    (2)strncmp基本思想:做比較操作,每4個字符作為一組來進行比較,以提高效率。掃描兩個串,每次循環時連續比較4個字符,直到比較完前n個字符。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产一区中文午夜| 日韩激情视频在线播放| 国产精品视频成人| 亚洲激情国产精品| 国产成人avxxxxx在线看| 亚洲免费福利视频| 欧美性猛交xxx| 欧美国产在线电影| 国产精品欧美久久久| 亚洲黄色成人网| 亚洲天堂男人天堂女人天堂| 久久青草精品视频免费观看| 九九精品在线观看| 亚洲最大福利视频网| 久久久久亚洲精品国产| 国产精品第一页在线| 97在线视频免费播放| 91嫩草在线视频| 爽爽爽爽爽爽爽成人免费观看| 日韩国产精品亚洲а∨天堂免| 久久99精品久久久久久噜噜| 欧美日本亚洲视频| 国产suv精品一区二区| 久久精品久久精品亚洲人| 日韩av电影手机在线观看| 国产精品视频免费在线观看| 精品在线欧美视频| 在线精品视频视频中文字幕| 91亚洲永久免费精品| 国语自产在线不卡| 欧美最顶级的aⅴ艳星| 欧美在线视频网站| 97国产suv精品一区二区62| 国产精品久久一| 中文字幕日韩欧美在线视频| 日韩av免费看| 国产精品一区二区三| 影音先锋欧美在线资源| 国产精品久久77777| 在线播放国产一区二区三区| 国内精品小视频在线观看| 精品久久香蕉国产线看观看亚洲| 欧美性猛交xxxx黑人| 欧美夫妻性生活视频| 91在线直播亚洲| 91在线免费观看网站| 国产美女直播视频一区| 国产精品夜色7777狼人| 亚洲欧洲午夜一线一品| 久久久久久综合网天天| 九九热精品视频国产| 青草热久免费精品视频| 国产精品美女午夜av| 亚洲国内精品视频| 欧洲中文字幕国产精品| 国产97在线视频| 97人人做人人爱| 日韩免费看的电影电视剧大全| 亚洲跨种族黑人xxx| 国产成人亚洲精品| 亚洲欧美日韩一区二区在线| 色综合久久88色综合天天看泰| 午夜精品理论片| 色妞色视频一区二区三区四区| 成人在线免费观看视视频| 热久久99这里有精品| 久久久精品视频成人| 日韩在线视频一区| 亚洲女同性videos| 国产精品久久精品| 日韩不卡在线观看| 久久天天躁夜夜躁狠狠躁2022| 午夜精品久久久久久久男人的天堂| 国模精品一区二区三区色天香| 91精品在线一区| 日本精品免费一区二区三区| 亚洲精品99久久久久| 久精品免费视频| 91精品国产高清久久久久久91| 亚洲最新在线视频| 欧美乱大交xxxxx另类电影| 国产精品一区=区| 国产成人av网址| 国产精品第2页| 日韩电影免费在线观看| www日韩中文字幕在线看| 热门国产精品亚洲第一区在线| 国产成人精品在线播放| 久久精品国产欧美激情| 国产视频综合在线| 成人性生交大片免费观看嘿嘿视频| 国产精品国语对白| 欧美在线视频在线播放完整版免费观看| 亚洲四色影视在线观看| 欧美成人激情图片网| 国产美女久久久| 成人激情视频小说免费下载| 中文字幕日韩欧美在线| 日韩黄色在线免费观看| 色一区av在线| 午夜精品一区二区三区在线| 蜜臀久久99精品久久久久久宅男| 国产精品69久久久久| 91精品成人久久| 国产精品第100页| 精品自拍视频在线观看| 亚洲视频777| 亚洲黄色www网站| 精品国产乱码久久久久久天美| 人妖精品videosex性欧美| 日韩不卡在线观看| 久久夜精品va视频免费观看| 性夜试看影院91社区| 国产精品入口免费视| 精品国产精品自拍| 孩xxxx性bbbb欧美| 日本一欧美一欧美一亚洲视频| 亚洲高清久久久久久| 久久久久久久97| 精品国产乱码久久久久久婷婷| 国外成人在线播放| 色妞色视频一区二区三区四区| 欧日韩不卡在线视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品一区二区三区在线播放| 精品久久久久久久久久久| 欧美激情第1页| 亚洲精品suv精品一区二区| 黄色一区二区三区| 精品国产乱码久久久久酒店| 91午夜在线播放| 亚洲美女在线观看| 久99九色视频在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 91久久精品国产91久久性色| 91精品视频大全| 亚洲精品视频久久| 国产手机视频精品| 成人黄色免费看| 久久欧美在线电影| 日韩福利视频在线观看| 最近日韩中文字幕中文| 亚洲 日韩 国产第一| 亚洲激情国产精品| 最近2019中文免费高清视频观看www99| 伊人久久大香线蕉av一区二区| 97国产suv精品一区二区62| 97av在线影院| 一本色道久久88亚洲综合88| 亚洲欧美在线一区| 久久久久99精品久久久久| 亚洲男人天堂视频| 欧美精品一区三区| 91av视频在线免费观看| 91系列在线观看| 久久久久久久久久久免费| 精品偷拍一区二区三区在线看| 欧美—级高清免费播放| 成人精品视频99在线观看免费| 亚洲三级黄色在线观看| 一区二区欧美久久| 久久99精品久久久久久青青91| 欧美国产日韩一区| 国产精品十八以下禁看|