精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C語言如何實現動態擴容的String

開發 后端
最近工作中使用C語言,但又苦于沒有高效的字符串實現,字符串的拼接和裁剪都比較麻煩,而且每個字符串都需要申請內存,內存的申請和釋放也很容易出bug,怎么高效的實現一個不需要處理內存問題并且可以動態擴容進行拼接和裁剪的string呢?

[[347888]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人 。轉載本文請聯系程序喵大人公眾號。

最近工作中使用C語言,但又苦于沒有高效的字符串實現,字符串的拼接和裁剪都比較麻煩,而且每個字符串都需要申請內存,內存的申請和釋放也很容易出bug,怎么高效的實現一個不需要處理內存問題并且可以動態擴容進行拼接和裁剪的string呢?

  • 一個好的string應該有以下功能?
  • 創建字符串
  • 刪除字符串
  • 尾部追加字符串
  • 頭部插入字符串
  • 從尾部刪除N個字符
  • 從頭部刪除N個字符
  • 裁剪字符串
  • 獲取字符串長度
  • 獲取完整字符串

下面來看看各個功能的實現:

首先定義一個string的句柄,相當于C++中的實例

  1. struct c_string; 
  2. typedef struct c_string c_string_t; 

在內部string的實現如下:

  1. // string的初始內存大小 
  2. static const size_t c_string_min_size = 32; 
  3.  
  4. struct c_string { 
  5.     char *str; // 字符串指針 
  6.     size_t alloced; // 已分配的內存大小 
  7.     size_t len; // 字符串的實際長度 
  8. }; 

創建字符串:

  1. c_string_t *c_string_create(void) { 
  2.     c_string_t *cs; 
  3.  
  4.     cs = calloc(1, sizeof(*cs)); 
  5.     cs->str = malloc(c_string_min_size); 
  6.     *cs->str = '\0'
  7.     // 初始分配內存大小是32,之后每次以2倍大小擴容 
  8.     cs->alloced = c_string_min_size;  
  9.     cs->len = 0; 
  10.  
  11.     return cs; 

銷毀字符串:

  1. void c_string_destroy(c_string_t *cs) { 
  2.     if (cs == NULLreturn
  3.     free(cs->str); 
  4.     free(cs); 

內部如何擴容呢:

  1. static void c_string_ensure_space(c_string_t *cs, size_t add_len) { 
  2.     if (cs == NULL || add_len == 0) return
  3.  
  4.     if (cs->alloced >= cs->len + add_len + 1) return
  5.  
  6.     while (cs->alloced < cs->len + add_len + 1) { 
  7.         cs->alloced <<= 1; // 每次以2倍大小擴容 
  8.         if (cs->alloced == 0) { 
  9.             // 左移到最后可能會變為0,由于alloced是無符號型,減一則會變成UINT_MAX 
  10.             cs->alloced--; 
  11.         } 
  12.     } 
  13.     cs->str = realloc(cs->str, cs->alloced); 

在尾部追加字符串:

  1. void c_string_append_str(c_string_t *cs, const char *str, size_t len) { 
  2.     if (cs == NULL || str == NULL || *str == '\0'return
  3.  
  4.     if (len == 0) len = strlen(str); 
  5.  
  6.     c_string_ensure_space(cs, len); // 確保內部有足夠的空間存儲字符串 
  7.     memmove(cs->str + cs->len, str, len); 
  8.     cs->len += len; 
  9.     cs->str[cs->len] = '\0'

在尾部追加字符:

  1. void c_string_append_char(c_string_t *cs, char c) { 
  2.     if (cs == NULLreturn
  3.     c_string_ensure_space(cs, 1); 
  4.     cs->str[cs->len] = c; 
  5.     cs->len++; 
  6.     cs->str[cs->len] = '\0'

在尾部追加整數:

  1. void c_string_append_int(c_string_t *cs, int val) { 
  2.     char str[12]; 
  3.  
  4.     if (cs == NULLreturn
  5.  
  6.     snprintf(str, sizeof(str), "%d", val); // 整數轉為字符串 
  7.     c_string_append_str(cs, str, 0); 

在頭部插入字符串:

  1. void c_string_front_str(c_string_t *cs, const char *str, size_t len) { 
  2.     if (cs == NULL || str == NULL || *str == '\0'return
  3.  
  4.     if (len == 0) len = strlen(str); 
  5.  
  6.     c_string_ensure_space(cs, len); 
  7.     memmove(cs->str + len, cs->str, cs->len); 
  8.     memmove(cs->str, str, len); 
  9.     cs->len += len; 
  10.     cs->str[cs->len] = '\0'

在頭部插入字符:

  1. void c_string_front_char(c_string_t *cs, char c) { 
  2.     if (cs == NULLreturn
  3.     c_string_ensure_space(cs, 1); 
  4.     memmove(cs->str + 1, cs->str, cs->len); 
  5.     cs->str[0] = c; 
  6.     cs->len++; 
  7.     cs->str[cs->len] = '\0'

在頭部插入整數:

  1. void c_string_front_int(c_string_t *cs, int val) { 
  2.     char str[12]; 
  3.  
  4.     if (cs == NULLreturn
  5.  
  6.     snprintf(str, sizeof(str), "%d", val); 
  7.     c_string_front_str(cs, str, 0); 

清空字符串:

  1. void c_string_clear(c_string_t *cs) { 
  2.     if (cs == NULLreturn
  3.     c_string_truncate(cs, 0); 

裁剪字符串:

  1. void c_string_truncate(c_string_t *cs, size_t len) { 
  2.     if (cs == NULL || len >= cs->len) return
  3.  
  4.     cs->len = len; 
  5.     cs->str[cs->len] = '\0'

刪除頭部的N個字符:

  1. void c_string_drop_begin(c_string_t *cs, size_t len) { 
  2.     if (cs == NULL || len == 0) return
  3.  
  4.     if (len >= cs->len) { 
  5.         c_string_clear(cs); 
  6.         return
  7.     } 
  8.  
  9.     cs->len -= len; 
  10.     memmove(cs->str, cs->str + len, cs->len + 1); 

刪除尾部的N個字符:

  1. void c_string_drop_end(c_string_t *cs, size_t len) { 
  2.     if (cs == NULL || len == 0) return
  3.  
  4.     if (len >= cs->len) { 
  5.         c_string_clear(cs); 
  6.         return
  7.     } 
  8.     cs->len -= len; 
  9.     cs->str[cs->len] = '\0'

獲取字符串的長度:

  1. size_t c_string_len(const c_string_t *cs) { 
  2.     if (cs == NULLreturn 0; 
  3.     return cs->len; 

返回字符串指針,使用的是內部的內存:

  1. const char *c_string_peek(const c_string_t *cs) { 
  2.     if (cs == NULLreturn NULL
  3.     return cs->str; 

重新分配一塊內存存儲字符串返回:

  1. char *c_string_dump(const c_string_t *cs, size_t *len) { 
  2.     char *out
  3.  
  4.     if (cs == NULLreturn NULL
  5.  
  6.     if (len != NULL) *len = cs->len; 
  7.     out = malloc(cs->len + 1); 
  8.     memcpy(out, cs->str, cs->len + 1); 
  9.     return out

測試代碼如下:

  1. int main() { 
  2.     c_string_t *cs = c_string_create(); 
  3.     c_string_append_str(cs, "123", 0); 
  4.     c_string_append_char(cs, '4'); 
  5.     c_string_append_int(cs, 5); 
  6.     printf("%s \n", c_string_peek(cs)); 
  7.     c_string_front_str(cs, "789", 0); 
  8.     printf("%s \n", c_string_peek(cs)); 
  9.     c_string_drop_begin(cs, 2); 
  10.     printf("%s \n", c_string_peek(cs)); 
  11.     c_string_drop_end(cs, 2); 
  12.     printf("%s \n", c_string_peek(cs)); 
  13.     c_string_destroy(cs); 
  14.     return 0; 

輸出:

  1. 12345 
  2. 78912345 
  3. 912345 
  4. 9123 

完整代碼如下:頭文件:

  1. #include <stddef.h> 
  2.  
  3. struct c_string; 
  4. typedef struct c_string c_string_t; 
  5.  
  6. c_string_t *c_string_create(void); 
  7.  
  8. void c_string_destroy(c_string_t *cs); 
  9.  
  10. void c_string_append_str(c_string_t *cs, const char *str, size_t len); 
  11.  
  12. void c_string_append_char(c_string_t *cs, char c); 
  13.  
  14. void c_string_append_int(c_string_t *cs, int val); 
  15.  
  16. void c_string_front_str(c_string_t *cs, const char *str, size_t len); 
  17.  
  18. void c_string_front_char(c_string_t *cs, char c); 
  19.  
  20. void c_string_front_int(c_string_t *cs, int val); 
  21.  
  22. void c_string_clear(c_string_t *cs); 
  23.  
  24. void c_string_truncate(c_string_t *cs, size_t len); 
  25.  
  26. void c_string_drop_begin(c_string_t *cs, size_t len); 
  27.  
  28. void c_string_drop_end(c_string_t *cs, size_t len); 
  29.  
  30. size_t c_string_len(const c_string_t *cs); 
  31.  
  32. const char *c_string_peek(const c_string_t *cs); 
  33.  
  34. char *c_string_dump(const c_string_t *cs, size_t *len); 

源文件:

  1. #include <ctype.h> 
  2. #include <stdbool.h> 
  3. #include <stdlib.h> 
  4. #include <stdio.h> 
  5. #include <string.h> 
  6.  
  7. static const size_t c_string_min_size = 32; 
  8.  
  9. struct c_string { 
  10.     char *str; 
  11.     size_t alloced; 
  12.     size_t len; 
  13. }; 
  14.  
  15. c_string_t *c_string_create(void) { 
  16.     c_string_t *cs; 
  17.  
  18.     cs = calloc(1, sizeof(*cs)); 
  19.     cs->str = malloc(c_string_min_size); 
  20.     *cs->str = '\0'
  21.     cs->alloced = c_string_min_size; 
  22.     cs->len = 0; 
  23.  
  24.     return cs; 
  25.  
  26. void c_string_destroy(c_string_t *cs) { 
  27.     if (cs == NULLreturn
  28.     free(cs->str); 
  29.     free(cs); 
  30.  
  31. static void c_string_ensure_space(c_string_t *cs, size_t add_len) { 
  32.     if (cs == NULL || add_len == 0) return
  33.  
  34.     if (cs->alloced >= cs->len + add_len + 1) return
  35.  
  36.     while (cs->alloced < cs->len + add_len + 1) { 
  37.         cs->alloced <<= 1; 
  38.         if (cs->alloced == 0) { 
  39.             cs->alloced--; 
  40.         } 
  41.     } 
  42.     cs->str = realloc(cs->str, cs->alloced); 
  43.  
  44. void c_string_append_str(c_string_t *cs, const char *str, size_t len) { 
  45.     if (cs == NULL || str == NULL || *str == '\0'return
  46.  
  47.     if (len == 0) len = strlen(str); 
  48.  
  49.     c_string_ensure_space(cs, len); 
  50.     memmove(cs->str + cs->len, str, len); 
  51.     cs->len += len; 
  52.     cs->str[cs->len] = '\0'
  53.  
  54. void c_string_append_char(c_string_t *cs, char c) { 
  55.     if (cs == NULLreturn
  56.     c_string_ensure_space(cs, 1); 
  57.     cs->str[cs->len] = c; 
  58.     cs->len++; 
  59.     cs->str[cs->len] = '\0'
  60.  
  61. void c_string_append_int(c_string_t *cs, int val) { 
  62.     char str[12]; 
  63.  
  64.     if (cs == NULLreturn
  65.  
  66.     snprintf(str, sizeof(str), "%d", val); 
  67.     c_string_append_str(cs, str, 0); 
  68.  
  69. void c_string_front_str(c_string_t *cs, const char *str, size_t len) { 
  70.     if (cs == NULL || str == NULL || *str == '\0'return
  71.  
  72.     if (len == 0) len = strlen(str); 
  73.  
  74.     c_string_ensure_space(cs, len); 
  75.     memmove(cs->str + len, cs->str, cs->len); 
  76.     memmove(cs->str, str, len); 
  77.     cs->len += len; 
  78.     cs->str[cs->len] = '\0'
  79.  
  80. void c_string_front_char(c_string_t *cs, char c) { 
  81.     if (cs == NULLreturn
  82.     c_string_ensure_space(cs, 1); 
  83.     memmove(cs->str + 1, cs->str, cs->len); 
  84.     cs->str[0] = c; 
  85.     cs->len++; 
  86.     cs->str[cs->len] = '\0'
  87.  
  88. void c_string_front_int(c_string_t *cs, int val) { 
  89.     char str[12]; 
  90.  
  91.     if (cs == NULLreturn
  92.  
  93.     snprintf(str, sizeof(str), "%d", val); 
  94.     c_string_front_str(cs, str, 0); 
  95.  
  96. void c_string_clear(c_string_t *cs) { 
  97.     if (cs == NULLreturn
  98.     c_string_truncate(cs, 0); 
  99.  
  100. void c_string_truncate(c_string_t *cs, size_t len) { 
  101.     if (cs == NULL || len >= cs->len) return
  102.  
  103.     cs->len = len; 
  104.     cs->str[cs->len] = '\0'
  105.  
  106. void c_string_drop_begin(c_string_t *cs, size_t len) { 
  107.     if (cs == NULL || len == 0) return
  108.  
  109.     if (len >= cs->len) { 
  110.         c_string_clear(cs); 
  111.         return
  112.     } 
  113.  
  114.     cs->len -= len; 
  115.     /* +1 to move the NULL. */ 
  116.     memmove(cs->str, cs->str + len, cs->len + 1); 
  117.  
  118. void c_string_drop_end(c_string_t *cs, size_t len) { 
  119.     if (cs == NULL || len == 0) return
  120.  
  121.     if (len >= cs->len) { 
  122.         c_string_clear(cs); 
  123.         return
  124.     } 
  125.     cs->len -= len; 
  126.     cs->str[cs->len] = '\0'
  127.  
  128. size_t c_string_len(const c_string_t *cs) { 
  129.     if (cs == NULLreturn 0; 
  130.     return cs->len; 
  131.  
  132. const char *c_string_peek(const c_string_t *cs) { 
  133.     if (cs == NULLreturn NULL
  134.     return cs->str; 
  135.  
  136. char *c_string_dump(const c_string_t *cs, size_t *len) { 
  137.     char *out
  138.  
  139.     if (cs == NULLreturn NULL
  140.  
  141.     if (len != NULL) *len = cs->len; 
  142.     out = malloc(cs->len + 1); 
  143.     memcpy(out, cs->str, cs->len + 1); 
  144.     return out

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2021-11-19 11:36:42

語言string字符串

2023-04-03 08:02:16

切片擴容GO

2022-10-21 09:01:41

StudentC++類型

2010-03-11 19:16:32

Python語言

2020-08-26 14:00:37

C++string語言

2022-01-13 10:30:21

C語言內存動態

2011-07-05 17:07:14

C語言

2023-10-26 11:03:50

C語言宏定義

2010-07-07 11:09:36

UDPClient

2021-05-10 20:58:11

數據庫擴容用戶

2014-08-05 13:09:34

Objective-C動態特性

2010-01-14 17:58:41

C++語言

2010-01-04 19:14:46

Silverlight

2024-08-13 09:16:30

2010-01-28 15:31:34

學習C++語言

2020-06-19 12:59:33

動態腳本Java

2010-12-01 15:28:19

ProbeVueJava

2009-08-28 16:14:26

C#實現加載動態庫

2022-09-02 17:07:46

C語言main()

2021-06-26 07:29:42

RedisHashtable數據
點贊
收藏

51CTO技術棧公眾號

天堂网av成人| jizzjizz在线观看| 亚洲黄色毛片| 精品中文字幕久久久久久| 一女被多男玩喷潮视频| 日本a一级在线免费播放| 国产精品一级| 中文字幕国产精品| 中文字幕在线视频精品| 综合久久2o19| 国产在线精品视频| 欧美黄色成人网| 无码人妻精品一区二区三区温州| 日韩电影免费观| 国产精品福利在线播放| 99免费在线观看视频| 全部毛片永久免费看| 嫩草一区二区三区| 欧美一级在线观看| 亚洲精品无码久久久久久| 成人在线免费看| 国产传媒一区在线| 奇米4444一区二区三区| 最近日本中文字幕| 日韩欧美专区| 亚洲mv大片欧洲mv大片精品| 亚洲一区二区精品在线| 蜜桃av噜噜一区二区三区麻豆| 久久福利一区| 欧美wwwxxxx| 性高潮久久久久久久| 91精品国产一区二区在线观看| 亚洲免费av网站| 日本免费高清不卡| 国产成人精品av在线观| 久久资源在线| 欧美高清视频在线| 奇米网一区二区| 欧美美女黄色| 欧美人妇做爰xxxⅹ性高电影 | 欧美狂野另类xxxxoooo| 色撸撸在线观看| 你懂的免费在线观看视频网站| 国产在线麻豆精品观看| 国产成人a亚洲精品| 精品99在线观看| 色爱综合网欧美| 亚洲免费av网址| 日本少妇xxxx| 日韩欧美中文字幕一区二区三区| 欧美三级乱人伦电影| 国产成人黄色片| 成人在线高清免费| 亚洲欧美另类综合偷拍| 亚洲一区二区三区免费观看| 男人的天堂在线| 97aⅴ精品视频一二三区| 99久久精品无码一区二区毛片| 中文字幕一区二区免费| 午夜在线视频一区二区区别 | 国产传媒在线观看| 亚洲精品免费在线观看| 亚洲高清精品中出| 国产毛片av在线| 久久一日本道色综合| 精品久久久久久一区| 亚洲精品一区二区三区四区| 另类的小说在线视频另类成人小视频在线| 欧洲永久精品大片ww免费漫画| 日韩av电影网| 亚洲精品乱码久久久久久蜜桃麻豆| 美女性感视频久久久| 男人的天堂久久久| 亚洲欧美一级二级三级| 久久精品中文字幕免费mv| 国产第一页精品| 99成人在线视频| 久久资源免费视频| 九九热只有精品| 亚洲影视一区二区三区| 毛片精品免费在线观看| 青娱乐国产在线视频| 欧美三区视频| 91精品国产一区| 久久精品国产亚洲AV无码麻豆| 亚洲日本激情| 亲爱的老师9免费观看全集电视剧| 久久亚洲天堂网| 日本怡春院一区二区| 国产精品午夜国产小视频| 依依成人在线视频| 精久久久久久久久久久| 亚洲一区二区日本| 亚洲精品18在线观看| 97久久久精品综合88久久| 欧美福利精品| 95在线视频| 亚洲精品成人精品456| 男人天堂a在线| av电影一区| 欧美久久一区二区| 在线免费看黄色片| 美国一区二区| 中文欧美在线视频| 欧美丰满艳妇bbwbbw| 亚洲精品男同| 国产在线观看一区二区三区| 亚洲老妇色熟女老太| 不卡一区二区三区四区| 日韩av电影免费播放| 美女羞羞视频在线观看| 亚洲国产精品久久一线不卡| 国产自偷自偷免费一区 | 国产精品每日更新在线播放网址| 日本精品免费视频| 性欧美1819sex性高清大胸| 亚洲18色成人| 中文字幕第17页| 麻豆成人入口| 日韩视频一区在线| 可以免费在线观看的av| 日本美女一区二区三区视频| 成人18视频| av女优在线| |精品福利一区二区三区| 麻豆tv在线播放| 国产成+人+综合+亚洲欧美| 精品国产1区二区| 国产精品综合激情| 宅男噜噜噜66一区二区| 亚洲mm色国产网站| 久草福利在线| 精品久久中文字幕| 日本亚洲一区二区三区| 成人精品视频| 欧美在线激情视频| 免费观看国产精品| 亚洲精品免费电影| 欧美激情第3页| 国产亚洲一区| 98视频在线噜噜噜国产| 国产免费久久久| 国产欧美一区二区三区网站| 青青艹视频在线| 911亚洲精品| 欧美成人在线免费| 一级特黄录像免费看| 91免费看片在线观看| 99久久久精品视频| 国产一区二区三区免费观看在线| 亚洲欧美中文日韩在线v日本| 国产在线观看成人| 国产丶欧美丶日本不卡视频| 一区二区三区四区五区精品 | 国产精品视频线看| 日韩免费高清在线| 欧美三级自拍| 久久久久久999| 亚洲av无码一区二区三区dv | 校园春色 亚洲| 久久国产乱子精品免费女| 欧美日韩大片一区二区三区| 麻豆mv在线观看| 亚洲的天堂在线中文字幕| 国产一级在线免费观看| 成人免费va视频| 超碰成人免费在线| 中文无码日韩欧| 欧美激情精品久久久久久黑人| 国产精品久久久久久无人区 | 国产a一区二区| 51xtv成人影院| 欧美本精品男人aⅴ天堂| 欧美成欧美va| 波多野结衣一区二区三区 | 一区二区蜜桃| 2022国产精品| 高潮在线视频| 精品国产区一区| 91精品国产高潮对白| 99久久婷婷国产综合精品电影| 免费观看美女裸体网站| 亚洲婷婷影院| 国产精品久久久久久久久久久不卡 | 欧美伊人久久久久久久久影院 | 一区二区日本伦理| 成人污版视频| 性色av一区二区三区免费| 天天操天天操天天操| 欧美日韩中国免费专区在线看| 久久久久久亚洲中文字幕无码| 免费一区二区视频| 欧美少妇在线观看| 秋霞在线一区| 国产精品女人久久久久久| av在线下载| 欧美一级片在线观看| 精品一级少妇久久久久久久| 91色视频在线| jizzzz日本| 激情久久婷婷| 五月天婷亚洲天综合网鲁鲁鲁| 日韩欧美三区| 91国自产精品中文字幕亚洲| 国产中文字幕在线播放| 555夜色666亚洲国产免| 日韩福利片在线观看| 国产亚洲成aⅴ人片在线观看| 国产美女视频免费看| 激情91久久| 日韩精品最新在线观看| 美女日韩一区| 国产成人在线播放| 污污片在线免费视频| 亚洲男人第一av网站| 国产精品熟女久久久久久| 五月综合激情网| youjizz亚洲女人| 懂色av噜噜一区二区三区av| 国产中文字幕二区| 999视频精品| 久久精品女人的天堂av| 成人豆花视频| 国产aaa精品| 俺来也官网欧美久久精品| 中文字幕日韩欧美| 午夜视频在线免费播放| 日韩欧美国产激情| 青娱乐在线视频免费观看| 国产精品无遮挡| 精品人妻一区二区三区日产乱码卜| 美洲天堂一区二卡三卡四卡视频| 日韩av中文字幕第一页| 国产精品久久占久久| 欧美精品成人一区二区在线观看| 日韩精品一区二区三区中文在线 | 性欧美hd调教| 91精品国产99久久久久久| caoporn免费在线| 中文字幕免费精品一区高清| 男操女在线观看| 亚洲激情电影中文字幕| 性色av蜜臀av| 91精品国产色综合久久不卡电影| 国产免费www| 欧美性xxxx在线播放| 三上悠亚在线观看视频| 日本一区二区动态图| 白丝女仆被免费网站| 成人av在线电影| 91精品国产高清91久久久久久| 黑人精品欧美一区二区蜜桃| 一区二区xxx| 三级成人在线视频| 六月丁香婷婷激情| 香蕉国产精品偷在线观看不卡| 大陆av在线播放| 1024精品一区二区三区| 国产二区视频在线| 欧美三级第一页| 免费看国产一级片| 久久不射网站| 色婷婷一区二区三区av免费看| 狠狠色伊人亚洲综合成人| 日本中文字幕精品| 91在线视频免费观看| 国产一二三四五区| 国产精品剧情在线亚洲| 色婷婷在线视频观看| 亚洲国产视频一区二区| 日韩精品一区二区三| 色8久久人人97超碰香蕉987| 亚洲影院一区二区三区| 日韩欧美一区在线观看| 亚洲三区在线观看无套内射| 在线观看国产欧美| 午夜在线激情影院| 欧美亚洲国产视频| 欧美三级电影网址| 成人自拍偷拍| 精品视频亚洲| 91精品国产吴梦梦| 亚洲欧美视频| theporn国产精品| av电影在线观看完整版一区二区| 日本性高潮视频| 一区二区在线看| www.色国产| 欧美一区二区三区白人 | 中文字幕亚洲自拍| 青青草视频在线免费直播| 欧美孕妇性xx| 欧美日韩国产一区二区在线观看| 久久久久久亚洲精品不卡4k岛国| 色999国产精品| 男人添女人下面高潮视频| 美女国产一区二区| 黄色免费视频网站| 亚洲欧美综合在线精品| 免费观看一区二区三区毛片| 欧美喷潮久久久xxxxx| 天堂av资源在线| 久久久999精品免费| 欧美xoxoxo| 国产精品国产精品| 国产精品久久久久久久免费观看 | 欧美国产视频一区| 日韩av中文字幕一区二区三区| 色诱av手机版| 国产精品久久看| 欧美在线观看不卡| 精品人伦一区二区色婷婷| 一本一道波多野毛片中文在线| 97免费视频在线播放| 成人国产精品一区二区网站| 日本不卡一区| 亚洲一区欧美二区| zjzjzjzjzj亚洲女人| 亚洲视频一区在线| 中文字幕在线网址| 亚洲少妇中文在线| 欧美日韩在线观看首页| 国产精品区一区二区三含羞草| 外国成人免费视频| 天天色综合天天色| 国产亚洲欧美日韩俺去了| 91视频免费网址| 亚洲国产精品悠悠久久琪琪| 欧美xxxx做受欧美88bbw| 91麻豆国产语对白在线观看| 欧美3p视频| 亚洲综合日韩欧美| 国产精品丝袜一区| 天天爱天天做天天爽| 亚洲欧洲在线看| 九色porny丨首页入口在线| 国产精品三区四区| 黄色在线一区| 亚洲熟女一区二区| 动漫精品一区二区| 日韩中文字幕影院| 国模私拍一区二区三区| 爱爱精品视频| 久久久久久www| 99久久精品国产一区二区三区| 国产午夜精品无码一区二区| 亚洲国产高清高潮精品美女| av3级在线| 精品一区日韩成人| 亚洲一区观看| 四虎国产精品成人免费入口| 在线观看亚洲精品视频| av在线播放av| 91免费国产视频| 欧美日韩精品一本二本三本 | 中文字幕视频一区| 国产女无套免费视频| 大量国产精品视频| swag国产精品一区二区| 黄色大片在线免费看| 久久久国产精品不卡| 日韩中文字幕高清| 最近2019中文字幕第三页视频| 99久久久成人国产精品| 麻豆md0077饥渴少妇| 成人av在线网| 亚洲成人av影片| 日韩在线观看免费高清| 日韩成人久久| 男女av免费观看| 国产精品三级av在线播放| 国产偷拍一区二区| 97色在线观看| 欧美大黑bbbbbbbbb在线| 国产ts在线观看| 色噜噜狠狠色综合中国| 欧美黑人激情| 国产欧美综合精品一区二区| 美女黄网久久| 男的操女的网站| 精品伊人久久97| 粉嫩av国产一区二区三区| 国产va亚洲va在线va| 国产日韩欧美麻豆| 性欧美8khd高清极品| 国产成+人+综合+亚洲欧洲 | 中文久久乱码一区二区| 国产激情视频在线播放| 日韩av123| 午夜欧美精品| 亚洲精品成人无码| 欧美va亚洲va香蕉在线| 三上悠亚国产精品一区二区三区| 日韩不卡一二区| 久久久久久久电影| 黄色aaa毛片| 国产欧美va欧美va香蕉在线| 一本久久知道综合久久| 麻豆精品国产免费| 亚洲人成在线播放|