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

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

開發 后端
眾所周知,C++ 中的string使用比較方便,關于C++ 中的string源碼實現可以看我的這篇文章:源碼分析C++的string的實現

[[435916]]

眾所周知,C++ 中的string使用比較方便,關于C++ 中的string源碼實現可以看我的這篇文章:源碼分析C++的string的實現

最近工作中使用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. struct c_string {  
  4.     char *str; // 字符串指針  
  5.     size_t alloced; // 已分配的內存大小  
  6.     size_t len; // 字符串的實際長度  
  7. }; 

創建字符串: 

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

銷毀字符串: 

  1. void c_string_destroy(c_string_t *cs) {  
  2.     if (cs == NULL) return;  
  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.     if (cs->alloced >= cs->len + add_len + 1) return;  
  4.     while (cs->alloced < cs->len + add_len + 1) {  
  5.         cs->alloced <<= 1; // 每次以2倍大小擴容  
  6.         if (cs->alloced == 0) {  
  7.             // 左移到最后可能會變為0,由于alloced是無符號型,減一則會變成UINT_MAX  
  8.             cs->alloced--;  
  9.         }  
  10.     }  
  11.     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.     if (len == 0) len = strlen(str);  
  4.     c_string_ensure_space(cs, len); // 確保內部有足夠的空間存儲字符串  
  5.     memmove(cs->str + cs->len, str, len);  
  6.     cs->len += len;  
  7.     cs->str[cs->len] = '\0';  

在尾部追加字符: 

  1. void c_string_append_char(c_string_t *cs, char c) {  
  2.     if (cs == NULL) return;  
  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.     if (cs == NULL) return;  
  4.     snprintf(str, sizeof(str), "%d", val); // 整數轉為字符串  
  5.     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.     if (len == 0) len = strlen(str);  
  4.     c_string_ensure_space(cs, len);  
  5.     memmove(cs->str + len, cs->str, cs->len);  
  6.     memmove(cs->str, str, len); 
  7.     cs->len += len;  
  8.     cs->str[cs->len] = '\0';  

在頭部插入字符: 

  1. void c_string_front_char(c_string_t *cs, char c) {  
  2.     if (cs == NULL) return;  
  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.     if (cs == NULL) return;  
  4.     snprintf(str, sizeof(str), "%d", val);  
  5.     c_string_front_str(cs, str, 0);  

清空字符串: 

  1. void c_string_clear(c_string_t *cs) {  
  2.     if (cs == NULL) return;  
  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.     cs->lenlen = len;  
  4.     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.     if (len >= cs->len) {  
  4.         c_string_clear(cs);  
  5.         return;  
  6.     }  
  7.     cs->len -len 
  8.     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.     if (len >= cs->len) {  
  4.         c_string_clear(cs);  
  5.         return;  
  6.     }  
  7.     cs->len -len 
  8.     cs->str[cs->len] = '\0';  

獲取字符串的長度: 

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

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

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

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

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

測試代碼如下: 

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

 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2020-10-23 06:56:00

C語言動態字符串

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

2020-06-19 12:59:33

動態腳本Java

2024-08-13 09:16:30

2010-01-28 15:31:34

學習C++語言

2010-12-01 15:28:19

ProbeVueJava

2022-09-02 17:07:46

C語言main()

2009-08-28 16:14:26

C#實現加載動態庫

2021-06-26 07:29:42

RedisHashtable數據
點贊
收藏

51CTO技術棧公眾號

久久精品嫩草影院| 中文字幕在线播出| 成人午夜sm精品久久久久久久| 久久亚洲综合色| 日本电影亚洲天堂| 男人操女人动态图| 成人国产在线| 亚洲人亚洲人成电影网站色| 91香蕉电影院| 国产福利视频网站| 波多野结衣一区二区三区免费视频| 亚洲国产aⅴ天堂久久| 欧美成人dvd在线视频| 在线观看黄色国产| 欧美天堂亚洲电影院在线观看| 日韩欧美国产小视频| 亚洲 高清 成人 动漫| 国产一区电影| 国产精品18久久久久久久久 | 国产精品久久久一区| 萌白酱视频在线| 在这里有精品| 色婷婷国产精品综合在线观看| 天天久久人人| 精品国自产在线观看| 亚洲免费激情| 中文字幕在线国产精品| 亚洲精品久久一区二区三区777| 三妻四妾完整版在线观看电视剧| 国产精品国产自产拍高清av | 538任你躁在线精品视频网站| 另类在线视频| 欧美精品1区2区| 91免费版看片| av资源网站在线观看| 国产成人在线电影| 国产精品激情av在线播放| 欧美国产精品一二三| 国产精品欧美在线观看| 日韩一区二区影院| 亚洲成人福利在线观看| 国产91足控脚交在线观看| 日本一区免费视频| 精品国产91亚洲一区二区三区www 精品国产_亚洲人成在线 | 久久蜜桃香蕉精品一区二区三区| 成人免费xxxxx在线观看| 国产微拍精品一区| 欧美日本国产| 色哟哟入口国产精品| 国产视频精品视频| 国产在线一区不卡| 欧美日韩国产大片| 熟妇人妻无乱码中文字幕真矢织江 | 国产精品996| 国产精品视频一区二区高潮| 91午夜精品亚洲一区二区三区| 欧美视频福利| 欧美精品亚州精品| 日本高清一二三区| 日韩欧美午夜| 亚洲福利精品在线| 日本wwwxx| 香蕉大人久久国产成人av| 91精品一区二区三区久久久久久 | 国产福利一区视频| 蜜桃视频在线观看播放| 欧美日韩裸体免费视频| 国产二级片在线观看| 成年人国产在线观看| 亚洲欧美一区二区视频| 亚洲一区二区三区乱码| 国产精品无码2021在线观看| 久久色中文字幕| 精品欧美一区二区久久久伦| 欧美一级特黄aaaaaa| 粉嫩av一区二区三区| 99理论电影网| 国产男女裸体做爰爽爽| 国产在线精品免费av| 91免费观看网站| 国产精品欧美久久久久天天影视| 久久一二三四| 国产精品免费一区| 97国产精品久久久| 国产精品中文欧美| 国产精品一码二码三码在线| 色噜噜在线播放| 不卡一区中文字幕| 精品国产乱码久久久久久郑州公司| 懂色av蜜臀av粉嫩av分享吧| 成人黄色综合网站| 久久精品一区二区三区不卡免费视频 | 亚洲成人av免费观看| 亚洲一区二区三区免费| 日韩成人中文字幕在线观看| 国产精品扒开腿做爽爽| 成人亚洲一区二区| 久久久精品欧美| 久久久久人妻一区精品色欧美| 一区精品久久| 日本亚洲精品在线观看| 亚洲天堂国产精品| 九九在线精品视频| 国产伦精品一区二区三区在线| 日本私人网站在线观看| 中文字幕免费观看一区| 国产精品av免费观看| 日本美女在线中文版| 亚洲一区二区偷拍精品| 欧洲av无码放荡人妇网站| jizz久久久久久| 日韩精品一区二区三区在线播放| 国产网站无遮挡| 国产二区精品| 97超级碰碰人国产在线观看| 中文字幕第99页| 成人黄色av电影| 久久涩涩网站| 国产精品剧情| 一本到不卡精品视频在线观看| 亚洲日本黄色片| 国产精品中文字幕制服诱惑| 亚洲精品电影网| 亚洲精品国产精品国自| 激情一区二区| 国产美女精品视频免费观看| 国产精品无码在线播放| 91网址在线看| 奇米777四色影视在线看| 亚洲成a人片| 精品黑人一区二区三区久久| 久久久久99精品成人| 亚洲黄色高清| 成人淫片在线看| 香蕉视频黄色片| 尤物视频一区二区| 少妇一级淫免费放| 神马午夜久久| 欧美激情一二三| 国产免费叼嘿网站免费| 国产欧美一区二区精品久导航| 国内少妇毛片视频| 成人亚洲精品| 最近2019年好看中文字幕视频| 日本天堂网在线| 国产乱码一区二区三区| 亚洲精品成人三区| 欧美成人影院| 亚洲精品久久久久久下一站| 久久久一区二区三区四区| 国产一区在线不卡| 亚洲欧美日韩精品久久久 | 97免费中文视频在线观看| 国产三级伦理片| 国产欧美视频一区二区| 欧美视频免费播放| 亚洲日本三级| 日本精品视频网站| 同心难改在线观看| 午夜精品视频在线观看| 蜜桃色一区二区三区| 欧美日韩亚洲一区| 99热最新在线| 女同一区二区免费aⅴ| 日韩一区二区三区视频在线观看| 女性裸体视频网站| 激情成人午夜视频| 中文字幕成人一区| 亚洲精品tv| 久久精品一区中文字幕| 国产露脸无套对白在线播放| 国产精品毛片无遮挡高清| 一区二区三区视频在线观看免费| 成人高清av| 成人xxxx视频| 新版中文在线官网| 日韩亚洲国产中文字幕欧美| 激情五月婷婷在线| 成人午夜精品在线| 国精产品一区一区三区视频| 噜噜噜狠狠夜夜躁精品仙踪林| 777777777亚洲妇女| 三级理论午夜在线观看| 欧美亚洲动漫另类| 三级影片在线观看| 国产精品资源在线| 欧美男女爱爱视频| 曰本一区二区三区视频| 日韩av第一页| 欧美被日视频| 精品久久久久久久久久久久包黑料| 国产精品二区一区二区aⅴ| 成人午夜电影网站| 黄色片视频在线免费观看| 九九综合九九| 国产一区在线播放| 欧美人体视频xxxxx| 亚洲美女动态图120秒| 中文字幕在线2018| 国产精品不卡在线| 欧美做受高潮中文字幕| 男人的天堂成人在线| 中国成人在线视频| h视频久久久| 国产精品久久久av| av在线播放观看| 亚洲美女激情视频| 国产精品久久久久久久一区二区| 亚洲理论在线观看| 波多野结衣办公室33分钟| 狠狠色丁香九九婷婷综合五月| 99热一区二区三区| 嫩草国产精品入口| 成人免费高清完整版在线观看| 久热在线观看视频| 色婷婷av一区二区三区在线观看| 蜜桃av中文字幕| 欧美午夜精品理论片a级按摩| 搜索黄色一级片| 99麻豆久久久国产精品免费| 最新天堂在线视频| 激情成人亚洲| 亚洲日本japanese丝袜| 久久中文资源| 亚洲尤物视频网| 欧美日韩激情电影| 欧美精品激情在线观看| 日日夜夜精品一区| 精品国产一区二区三区不卡| 一本色道久久综合无码人妻| 欧美日韩国产精品一区二区三区四区| 中文字幕第20页| 成人a区在线观看| 亚洲欧美天堂在线| 青青青爽久久午夜综合久久午夜| www.av毛片| 韩国av一区| 中文字幕欧美日韩一区二区| 欧美欧美黄在线二区| 国产伦精品一区二区三区视频孕妇 | 欧美大片免费久久精品三p| a片在线免费观看| 精品久久久久久久久久| 久久精品视频6| 夜夜爽夜夜爽精品视频| 一区二区三区影视| 国产精品无遮挡| 午夜理伦三级做爰电影| 久久综合色婷婷| 免费a级黄色片| www国产亚洲精品久久麻豆| 性欧美13一14内谢| 国产清纯美女被跳蛋高潮一区二区久久w| 日本一级片在线播放| 99久久免费视频.com| 欧美 日本 国产| 26uuu精品一区二区| 亚洲一区二区自偷自拍| 国产精品日韩精品欧美在线| 久久精品亚洲a| 亚洲欧美激情在线| 国产一卡二卡在线播放| 亚洲丰满少妇videoshd| 亚洲免费黄色网址| 91极品视觉盛宴| 国产片在线播放| 日韩欧美国产1| 日韩电影免费| 中文字幕亚洲字幕| 影音先锋在线视频| 91av视频在线观看| 国产一区二区三区朝在线观看| 国产精品自产拍在线观看中文| 精品视频一区二区三区在线观看| 国产二区一区| 婷婷成人影院| 亚洲一区二区三区四区中文| 欧美韩国一区| 无码人妻丰满熟妇区五十路百度| 青青青爽久久午夜综合久久午夜| 熟妇无码乱子成人精品| 99久久精品情趣| 国产日韩精品中文字无码| 亚洲综合色噜噜狠狠| 成人公开免费视频| 欧美一区二区三区色| 午夜影院免费体验区| 色妞久久福利网| 不卡视频观看| 国产在线视频91| 九色丨蝌蚪丨成人| 亚洲一区精彩视频| 精品福利电影| 成年网站免费在线观看| thepron国产精品| 日韩激情小视频| 天天综合色天天综合色h| 一级淫片免费看| 亚洲精品视频免费| 欧美videosex性欧美黑吊| 国产精品欧美亚洲777777| 丁香婷婷成人| 视频一区二区视频| 日韩1区2区日韩1区2区| 免费看毛片的网站| 成人欧美一区二区三区1314| 黄色一级片免费在线观看| 91精品国产免费| xxxxx日韩| 奇米影视亚洲狠狠色| 亚洲码欧美码一区二区三区| 一区二区不卡在线| 免费看黄裸体一级大秀欧美| av漫画在线观看| 国产精品短视频| 日韩乱码一区二区三区| 亚洲精品国产精品国自产在线| a黄色片在线观看| 国产精品久久久久久久久借妻| 日韩有码中文字幕在线| 国产91沈先生在线播放| 狠狠色2019综合网| 啪啪一区二区三区| 色菇凉天天综合网| 色吊丝在线永久观看最新版本| 久久人人看视频| 4438全国亚洲精品观看视频| 9999在线观看| 奇米一区二区三区| 国产传媒国产传媒| 色综合欧美在线| 天天在线女人的天堂视频| 欧美激情在线观看视频| av成人app永久免费| a级片一区二区| 国产福利一区二区三区在线视频| 在线日韩国产网站| 欧美日韩国产另类一区| 五月婷婷在线视频| 成人免费看黄网站| 亚洲成人精品| 1314成人网| 一区二区三区在线视频播放| a天堂中文在线观看| 久久夜色精品亚洲噜噜国产mv| 国产精品色婷婷在线观看| 在线一区高清| 国产一区二区三区在线看麻豆 | 一个色综合网站| 精品国产伦一区二区三区| 欧美人与性动交| 欧美高清视频看片在线观看| 尤物av无码色av无码| 99精品黄色片免费大全| 成人在线免费看视频| 亚洲天堂免费观看| 久久精品97| 日本丰满大乳奶| 成人免费av资源| a v视频在线观看| 国产亚洲精品美女| 日本久久二区| 男人天堂新网址| 99久久精品国产导航| 欧美一区二区激情视频| 国产亚洲一区二区在线| a一区二区三区亚洲| 欧美视频在线第一页| 91社区在线播放| 波多野结衣网站| 欧美成人全部免费| 亲子伦视频一区二区三区| 国产精品天天av精麻传媒| 综合在线观看色| 黑人乱码一区二区三区av| 日本一区二区三区在线播放| 99精品综合| 日本黄色动态图| 欧美亚洲国产一卡| 伊人福利在线| 欧美另类一区| 激情另类小说区图片区视频区| 日本三级网站在线观看| 亚洲午夜激情免费视频| 日韩精品成人在线观看| 日本黄色三级大片| 亚洲欧美激情插| 国产一区二区三区福利| 51国产成人精品午夜福中文下载| 香蕉久久夜色精品| 国产又黄又粗又猛又爽的| 亚洲第一区第一页| 国产精品原创视频| 精品无码国产一区二区三区av| 欧美国产综合一区二区| 性生交生活影碟片| 国产成人亚洲综合青青| 亚洲精品国产日韩| 91香蕉视频在线播放| 亚洲欧美综合精品久久成人|