精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

水蜜桃精品av一区二区| 日本欧美电影在线观看| 天堂av在线一区| 中文字幕在线看视频国产欧美| 亚洲欧美手机在线| 欧美大胆的人体xxxx| 99久久夜色精品国产网站| 国产精品2018| 69av视频在线| 蜜臀久久99精品久久一区二区| 欧美日韩精品系列| 人妻无码一区二区三区四区| 欧洲成人av| 国产精品资源在线看| 欧美在线视频在线播放完整版免费观看 | 久久久久国产免费| 国产精品专区免费| 一区二区三区欧美久久| 日韩激情视频| 午夜视频免费看| 精品一区二区三区久久久| 欧美孕妇与黑人孕交| 极品盗摄国产盗摄合集| 国产免费久久| 亚洲第一综合天堂另类专| 99热手机在线| 中文字幕21页在线看| 亚洲精品日韩综合观看成人91| 秋霞在线观看一区二区三区| 午夜精品久久久久久久99热黄桃| 免费成人在线视频观看| 欧美又大又粗又长| 久久精品性爱视频| 91精品亚洲| 中文字幕亚洲欧美一区二区三区 | a级高清视频欧美日韩| 成人a免费视频| 天天射天天干天天| 99亚洲伊人久久精品影院红桃| 久久天堂av综合合色| 精品无码国产污污污免费网站 | 欧美日韩一区二区视频在线观看 | 国产精选第一页| 欧美aaaaaaaaaaaa| 国产亚洲a∨片在线观看| 午夜久久久久久久| 国产一区二区三区不卡av| 日韩一级欧美一级| 伊人五月天婷婷| 欧美日韩va| 欧美性大战久久久久久久蜜臀| 国产97在线 | 亚洲| 欧美黑人猛交的在线视频| 综合激情成人伊人| 制服诱惑一区| 黄色免费在线网站| 成人欧美一区二区三区黑人麻豆| 亚洲成人网上| 日本免费在线观看| 亚洲欧洲99久久| 中文字幕一区二区三区四区五区| a天堂在线资源| 亚洲欧洲av另类| 国产成人精品免费看在线播放| 欧美jizz18性欧美| 亚洲欧美国产毛片在线| 国产肉体ⅹxxx137大胆| 国产盗摄一区二区| 婷婷亚洲久悠悠色悠在线播放| 欧美成人高潮一二区在线看| 欧美男男tv网站在线播放| 精品久久久久久国产91| 男人天堂999| 蜜桃成人精品| 欧美精品日韩精品| 免费欧美一级片| 国产精品对白| 亚洲欧洲激情在线| 日本伦理一区二区三区| 91精品成人| 久久免费视频观看| aaa在线视频| 久久成人羞羞网站| 亚洲xxxx在线| av女名字大全列表| 国产午夜精品久久| 一区二区三区四区免费观看| 天堂亚洲精品| 色婷婷精品大在线视频| 午夜免费看毛片| 在线视频亚洲欧美中文| 亚洲精品视频网上网址在线观看| a天堂中文字幕| 91精品国产调教在线观看| 久久91精品国产| 国产成人综合欧美精品久久| 免费欧美在线视频| 成人欧美一区二区三区视频 | 色8久久久久| 日韩三级高清在线| 成人免费av片| 在线国产一区二区| 欧美性做爰毛片| 一本一道精品欧美中文字幕| 成人av在线看| 视频在线精品一区| 黄色的视频在线观看| 在线视频你懂得一区| 国模大尺度视频| 九九热精品视频在线观看| 久久视频国产精品免费视频在线| 91av在线免费视频| 黑人精品欧美一区二区蜜桃| 激情欧美一区二区三区中文字幕| 9色在线观看| 精品久久久久久久久久久久久| 天天爽人人爽夜夜爽| jizz性欧美2| 精品国产视频在线| 久久久久99精品成人片我成大片| 国产精品一区二区久激情瑜伽| 欧美系列一区| 国产免费拔擦拔擦8x高清在线人 | 亚洲日本va在线观看| 六月激情综合网| 日韩欧美高清一区二区三区| 在线观看日韩av| 亚洲欧美综合另类| 成人小视频在线| 99亚洲精品视频| 成人在线免费| 亚洲女人天堂视频| 国产精品成人免费一区二区视频| 韩国精品久久久| 午夜精品视频在线观看一区二区| 捆绑调教日本一区二区三区| 日韩女优av电影| 农村妇女精品一区二区| 蜜桃精品在线观看| 五月天亚洲综合小说网| 最新欧美色图| 精品无码久久久久久国产| 久久99久久久| 国产宾馆实践打屁股91| 日韩视频在线免费播放| 国内自拍亚洲| 亚洲无限av看| 国产无遮挡又黄又爽又色视频| 久久综合色之久久综合| 欧美二区在线视频| 欧洲精品一区| 欧美一级免费视频| 色播色播色播色播色播在线 | 区一区二在线观看| 久久亚洲综合色一区二区三区| 日韩欧美一区二| 免费萌白酱国产一区二区三区| 久久久久久久久亚洲| 亚洲高清在线观看视频| 亚洲网友自拍偷拍| 国产xxxx视频| 亚洲一区成人| 天堂av一区二区| 欧美啪啪网站| 欧美大片免费观看| 国产精品久久免费| 一区二区三区欧美日| youjizz.com日本| 99精品久久| 欧美人与物videos另类| 久久精品嫩草影院| 不卡中文字幕av| 国产综合视频在线| 日韩欧美精品中文字幕| 亚洲精品午夜视频| 激情国产一区二区| 一卡二卡三卡视频| 欧美日韩播放| 国产精品欧美日韩| 久久免费电影| 亚洲精品一区久久久久久| 中文在线免费观看| 亚洲精品欧美激情| 中文字幕丰满孑伦无码专区| 免费观看在线综合色| 一级黄色片播放| 久久精品论坛| 国产精品丝袜久久久久久不卡| 麻豆网站在线观看| 亚洲精品v天堂中文字幕| 91丨九色丨海角社区| 亚洲男同性视频| 亚洲欧美色图视频| 韩国欧美国产1区| 国产精品丝袜久久久久久消防器材| 欧美日中文字幕| 风间由美久久久| 国模一区二区| 久久人人爽国产| 国产大学生校花援交在线播放| 欧美一区二区三区色| 激情五月色婷婷| 国产精品成人一区二区艾草 | 136福利视频导航| 亚洲成人动漫av| xxxxx99| 成人一区二区三区在线观看| 亚洲老女人av| 亚洲免费播放| 一道本在线观看视频| 丝袜美腿一区二区三区动态图| 国产免费一区二区三区在线能观看 | 国产h视频在线播放| 国产精品麻豆久久| 欧美区高清在线| 成人搞黄视频| 91香蕉亚洲精品| 欧美二三四区| 国语自产精品视频在线看抢先版图片| 永久免费av在线| 亚洲日本中文字幕| 国产91免费看| 日韩一区二区不卡| 亚洲一卡二卡在线| 欧美性猛交xxxx免费看| 国产精彩视频在线| 亚洲毛片av在线| 国产精品无码无卡无需播放器| 99久久er热在这里只有精品15| 麻豆传媒在线看| 精品亚洲aⅴ乱码一区二区三区| 波多野结衣作品集| 国产精品尤物| 1024av视频| 亚洲第一伊人| 91午夜在线观看| 中文字幕日韩一区二区不卡| 亚洲视频电影| 欧美一区二区三区激情视频 | 五月婷婷丁香网| 日韩精品一区二区在线| 国产三区在线播放| 欧美日高清视频| 一级特黄aa大片| 欧美日韩一区二区三区四区五区| 波多野结衣日韩| 在线影视一区二区三区| 9i精品福利一区二区三区| 欧美日韩国产一区在线| 日韩少妇裸体做爰视频| 亚洲成人手机在线| 国产成人一区二区三区影院在线| 亚洲国产精品久久人人爱蜜臀| 美女视频黄免费| 亚洲最色的网站| 日本五十熟hd丰满| 天天综合天天综合色| 久草视频在线观| 色呦呦国产精品| 波多野结衣黄色| 欧美日韩黄色一区二区| 夜夜躁很很躁日日躁麻豆| 亚洲精品影片| 亚洲视频在线视频| wwwxxx在线观看| 日韩在线视频观看| 在线观看电影av| 久久免费视频网站| 欧美黑人粗大| 国产日韩欧美另类| 亚洲超碰在线观看| 国内精品视频在线播放| 免费观看不卡av| 亚洲午夜高清视频| 欧美在线91| 狠狠干 狠狠操| 玖玖在线精品| www.成年人| 成人免费视频网站在线观看| 亚洲av网址在线| 中文字幕+乱码+中文字幕一区| 午夜激情视频在线播放| 一区二区免费在线| 精品久久久久久久久久久久久久久久 | 日本不卡免费新一二三区| 成人毛片免费看| www.69av| 噜噜噜躁狠狠躁狠狠精品视频| 中文字幕亚洲乱码| 成人晚上爱看视频| 国产黄色大片免费看| 亚洲激情校园春色| 亚洲精品成人在线视频| 在线播放中文字幕一区| 亚欧洲精品视频| 精品久久久av| 亚洲伊人av| 5566av亚洲| 国产亚洲一区| 久久精品无码中文字幕| 视频一区视频二区在线观看| 下面一进一出好爽视频| 国产亚洲精品资源在线26u| 免费日韩在线视频| 欧美亚洲禁片免费| 五月婷婷六月色| 久久影院中文字幕| 日韩av一级| 国产视频一区二区不卡| 婷婷亚洲五月| 粗暴91大变态调教| 成人黄色小视频在线观看| 日本午夜精品视频| 欧美日韩裸体免费视频| 国产免费高清av| 国产亚洲精品美女| 第一福利在线视频| 91久久久一线二线三线品牌| 不卡一区综合视频| 国模吧无码一区二区三区| 国产不卡视频在线播放| 亚洲色图100p| 91黄色在线观看| 性高潮久久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久9久9色综合| 丰满的少妇愉情hd高清果冻传媒 | 欧美深性狂猛ⅹxxx深喉| 亚洲黄网站在线观看| 一本一道精品欧美中文字幕| 尤物九九久久国产精品的特点 | xxxx视频在线观看| 国产精品家庭影院| 日本一区二区三区久久| 亚洲人成在线电影| 伊人久久视频| 鲁丝一区鲁丝二区鲁丝三区| 国产一区视频在线观看免费| 精品亚洲视频在线| 国产精品久99| 国产又粗又黄视频| 最近2019年中文视频免费在线观看 | 国产 日韩 欧美 综合 一区| 麻豆md0077饥渴少妇| 美国十次了思思久久精品导航| 亚洲区自拍偷拍| 色综合天天狠狠| 人人九九精品| 热久久免费视频精品| 欧美男gay| www日韩在线观看| 国产亚洲精品bt天堂精选| 91丨九色丨海角社区| 一区三区二区视频| 国产精品99| 樱花www成人免费视频| 精品夜夜嗨av一区二区三区| 日本一级片免费| 日韩免费高清av| 欧美家庭影院| 国产主播一区二区三区四区| 在线综合亚洲| 人人妻人人澡人人爽人人精品| 天天综合天天综合色| 少妇激情av一区二区| 欧洲中文字幕国产精品| 国产麻豆精品久久| 国产欧美一区二| 一区二区三区四区在线免费观看 | 狠狠久久亚洲欧美专区| 国产乱淫片视频| 欧美二区乱c黑人| 群体交乱之放荡娇妻一区二区 | 蜜臀久久久99精品久久久久久| 超碰人人干人人| 日韩视频永久免费| 白白色在线观看| 欧美综合77777色婷婷| 免费人成黄页网站在线一区二区| 欧美性x x x| 亚洲高清久久网| 国模套图日韩精品一区二区| 亚洲精品8mav| 国产成人精品午夜视频免费| 日本天堂网在线| 中文字幕精品一区久久久久| 天堂va在线高清一区| 自慰无码一区二区三区| 国产精品你懂的| 亚洲精选一区二区三区| 日本高清久久天堂| 午夜免费一区| 91丨九色丨蝌蚪| 欧美日韩国产一区二区| 日韩在线观看www| 国产欧美一区二区在线播放| 奇米精品一区二区三区四区| 亚洲一区 视频| 中文字幕亚洲无线码a| 欧美一级全黄|