C++字符串處理小結(jié)

C++中的字符串類型

常用的C++的字符串類型主要是std::string。它是模板std::basic_string的一個(gè)實(shí)例化。另外還有三個(gè)實(shí)例化std::wstringstd::u16stringstd::u32string,不過不是很常用。

std::basic_string<T>
std::string            std::basic_string<char>
std::wstring           std::basic_string<wchar_t>
std::u16string         std::basic_string<char16_t>
std::u32string         std::basic_string<char32_t>

具體可以參考:http://en.cppreference.com/w/cpp/string/basic_string

std::string

標(biāo)準(zhǔn)庫中,std::string的成員函數(shù)和相關(guān)的算法特別多,從上面給出的鏈接里的內(nèi)容,粗略計(jì)算一下,包括所有的重載函數(shù),也有百余個(gè)了。但是在實(shí)際的工作使用中,很多時(shí)候,總是會(huì)感覺,C++對(duì)字符串的處理支持實(shí)在是弱爆了……感覺這個(gè)具有百余個(gè)方法的“巨”類用起來總是捉襟見肘。

std::string中的很多操作都是基于迭代器的——這樣的話,很多操作,我們都需要先調(diào)用find或者直接遍歷字符串拿到操作區(qū)間的迭代器,然后再進(jìn)行實(shí)際的操作。成員函數(shù)中:inserterasereplace都是基于迭代器的操作。

同時(shí),std::string也沒有提供一些常用的字符串處理的方法,比如:簡單的大小寫轉(zhuǎn)換,字符串連接,字符串分割等。

C++11中,提供了std::string的數(shù)字和字符串相互轉(zhuǎn)換的算法:

  • 字符串==>數(shù)字
    stoi string to int
    stol string to long
    stoll string to long long
    stoul string to unsigned long
    stoull string to unsigned long long
    stof string to float
    stod string to double
    stold string to long double
  • 數(shù)字==>字符串
    to_string
    to_wstring

Boost中的字符串處理

Boost庫通過算法的形式,提供了一些處理C++字符串的函數(shù),雖然比起Java或者其它一些動(dòng)態(tài)語言還是略顯不足,但也算在一定程度上方便了我們對(duì)C++的字符串處理。

除了普通的字符串處理算法,Boost庫還提供了一個(gè)正則表達(dá)式的函數(shù)庫Boost.Regex。Boost.Regex已經(jīng)被納入到C++11的標(biāo)準(zhǔn)之中,但是我們常用的g++4.8.x(比如ubuntu14.04默認(rèn)的g++版本就是4.8.x,公司的g++版本也是4.8.x)的C++標(biāo)準(zhǔn)庫還沒有實(shí)現(xiàn)正則表達(dá)式。

實(shí)際上,g++4.8.x已經(jīng)定義了標(biāo)準(zhǔn)庫正則表達(dá)式的類型和接口,但是只是占了個(gè)坑,并沒有真正實(shí)現(xiàn)……結(jié)果可以編譯通過,但是運(yùn)行一直拋出異常。gcc4.9才真正實(shí)現(xiàn)了標(biāo)準(zhǔn)庫的正則表達(dá)式

下面通過例子介紹一個(gè)Boost提供的字符串處理算法以及Boost.Regex的用法。

Boost的字符串算法

  • 頭文件:#include <boost/algorithm/string.hpp>
  • Boost的很多修改字符串的算法都提供了直接修改傳入字符串,名字不帶copy返回一個(gè)新的字符串,名字帶copy兩個(gè)版本。

字符串大小寫轉(zhuǎn)換

C++標(biāo)準(zhǔn)庫竟然連一個(gè)字符串大小寫的轉(zhuǎn)換函數(shù)都沒有提供。

  • boost::algorithm::to_upper(), boost::algorithm::to_lower()直接修改傳入的字符串,將其轉(zhuǎn)換為對(duì)應(yīng)字符串的大寫或小寫。
  • boost::algorithm::to_upper_copy(), boost::algorithm::to_lower_copy()返回一個(gè)新的大寫或小寫字符串。
  • 例子:
#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    std::string s("AbCdefG123 HijkLmn");
    cout << boost::algorithm::to_upper_copy(s) << endl;
    boost::algorithm::to_lower(s);
    cout << s << endl;
}
輸出結(jié)果:
ABCDEFG123 HIJKLMN
abcdefg123 hijklmn

子串刪除。

  • std::string提供了幾個(gè)erase成員函數(shù),都是基于“位置(下標(biāo)或迭代器)”的刪除:
basic_string& erase(size_type index = 0, size_type count = npos);
iterator erase(iterator position);
iterator erase(const_iterator position);
iterator erase(iterator first, iterator last);
iterator erase(const_iterator first, const_iterator last);
  • STL提供的remove系列的算法,由于其需要與其他容器通用,其刪除時(shí)的比較函數(shù)只能是一個(gè)字符之間的比較(std::string中的一個(gè)字符相當(dāng)于vector中的一個(gè)元素)。
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value);
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p);
OutputIt remove_copy(InputIt first, InputIt last, OutputIt d_first, const T& value);
OutputIt remove_copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate p);
  • Boost提供了刪除字符串子串的算法。
erase_all()刪除主串中所有相等的子串。
erase_first()刪除主串中第一個(gè)相等的子串。
erase_nth()刪除主串中的第n個(gè)子串。**注意這里的n是從0開始的。**
erase_head()刪除主串的前n個(gè)字符。
erase_tail()刪除組成的后n個(gè)字符。
erase系列的copy版本

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    std::string s("AbCdefG123 HijkLmn");
    s += s;
    s += s;
    string s0 = s;
    cout << "Input String: " << s0 << endl;
    cout << boost::algorithm::erase_all_copy(s0, "AbC") << endl;
    cout << boost::algorithm::ierase_all_copy(s0, "ABC") << endl;
    cout << boost::algorithm::erase_first_copy(s0, "defG123") << endl;
    cout << boost::algorithm::ierase_first_copy(s0, "DEFG123") << endl;
    cout << boost::algorithm::erase_nth_copy(s0, "HijkLmn", 1) << endl;
    cout << boost::algorithm::ierase_nth_copy(s0, "HIJKLMN", 1) << endl;
    cout << boost::algorithm::erase_head_copy(s0, 3) << endl;
    cout << boost::algorithm::erase_tail_copy(s0, 5) << endl;
}
輸出結(jié)果:
Input String: AbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmn
defG123 HijkLmndefG123 HijkLmndefG123 HijkLmndefG123 HijkLmn
defG123 HijkLmndefG123 HijkLmndefG123 HijkLmndefG123 HijkLmn
AbC HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmn
AbC HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmn
AbCdefG123 HijkLmnAbCdefG123 AbCdefG123 HijkLmnAbCdefG123 HijkLmn
AbCdefG123 HijkLmnAbCdefG123 AbCdefG123 HijkLmnAbCdefG123 HijkLmn
defG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmn
AbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 HijkLmnAbCdefG123 Hi

子串查找

  • Boost的這些字符串的find算法的返回值都是boost::iterator_range類型的一對(duì)迭代器。
  • find_first() 查找第一個(gè)匹配的子串。std::string::find能實(shí)現(xiàn)一樣的功能。(find_first的實(shí)現(xiàn)應(yīng)該是封裝了這個(gè)成員函數(shù),不過個(gè)人感覺這個(gè)算法用起來更方便。)
  • find_last() 查找最后一個(gè)匹配的子串。std::string::rfind能實(shí)現(xiàn)一樣的功能。
  • find_nth() 查找第n(n>=0)個(gè)匹配的字符串。
  • find_head(s, n) 返回字符串的前n個(gè)字符。
  • find_tail(s, n) 返回字符串的最后n個(gè)字符。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    std::string s("AbCdefG123 HijkLmn");
    s += s;
    s += s;
    cout << "Input String: " << s << endl;
    boost::iterator_range<std::string::iterator> itRange = boost::algorithm::find_first(s, "123");
    cout << itRange << endl;
    cout << itRange.begin() - s.begin() << endl;
    cout << itRange.end() - s.begin() << endl;
    itRange = boost::algorithm::find_last(s, "123");
    cout << itRange << endl;
    cout << itRange.begin() - s.begin() << endl;
    cout << itRange.end() - s.begin() << endl;
    itRange = boost::algorithm::find_nth(s, "123", 1);
    cout << itRange << endl;
    cout << itRange.begin() - s.begin() << endl;
    cout << itRange.end() - s.begin() << endl;
    itRange = boost::algorithm::find_head(s, 5);
    cout << itRange << endl;
    cout << itRange.begin() - s.begin() << endl;
    cout << itRange.end() - s.begin() << endl;
    itRange = boost::algorithm::find_tail(s, 5);
    cout << itRange << endl;
    cout << itRange.begin() - s.begin() << endl;
    cout << itRange.end() - s.begin() << endl;
}

輸出結(jié)果:
123
7
10
123
61
64
123
25
28
AbCde
0
5
jkLmn
67
72

連接字符串

  • Boost庫提供了join()算法接受一個(gè)字符串容器作為第一個(gè)參數(shù),根據(jù)第二個(gè)參數(shù)將這些字符串連接起來。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<string> sVec{"ABC", "def", "GHIJK", "123456"};
    cout << boost::algorithm::join(sVec, "+**+") << endl;
}
輸出結(jié)果:
ABC+**+def+**+GHIJK+**+123456

替換字符串

replace_first()替換第一個(gè)匹配的字符串。
replace_nth()替換第n(n>=0)個(gè)匹配的字符串。
replace_last()替換最后一個(gè)匹配的字符串。
replace_all()替換所有匹配的字符串。
replace系列的copy版本。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("AbcDeFGHIJklmn");
    s += s;
    s += s;
    cout << "Input String: " << s << endl;
    cout << boost::algorithm::replace_all_copy(s, "AbcD", "**") << endl;
    cout << boost::algorithm::replace_first_copy(s, "AbcD", "**") << endl;
    cout << boost::algorithm::replace_last_copy(s, "AbcD", "**") << endl;
    cout << boost::algorithm::replace_nth_copy(s, "AbcD", 1, "**") << endl;
}
輸出結(jié)果:
Input String: AbcDeFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmn
**eFGHIJklmn**eFGHIJklmn**eFGHIJklmn**eFGHIJklmn
**eFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmn
AbcDeFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmn**eFGHIJklmn
AbcDeFGHIJklmn**eFGHIJklmnAbcDeFGHIJklmnAbcDeFGHIJklmn

消除字符串兩端的特殊字符

  • 很多時(shí)候,我們會(huì)希望刪除字符左右兩邊的空白字符。Boost提供了幾個(gè)算法來實(shí)現(xiàn)這個(gè)功能。
trim_left()刪除字符串左邊的空白。
trim_right()刪除字符串右邊的空白。
trim()刪除字符串左右兩邊的空白。
trim系列的copy版本。
  • 有時(shí)候,我們想要?jiǎng)h除的不僅僅是字符串左右兩邊的空白,而是其它一下特定的字符。
trim_left_if()
trim_right_if()
trim_if()
trim_if系列的copy版本,如果`trim_left_copy_if`...
  • Boost庫的if系列算法通常傳入一個(gè)"謂詞參數(shù)", 如:
is_any_of
is_space 是否是空白字符。
is_alnum是否是字母或數(shù)字。
is_alpha是否時(shí)字母。
is_cntrl是否控制字符。
is_digit是否十進(jìn)制數(shù)字。
is_graph是否圖形字符。
is_lower是否小寫字母。
is_print是否可打印字符。
is_punct是否標(biāo)點(diǎn)符號(hào)。
is_upper是否大寫字符。
is_xdigit是否十六進(jìn)制數(shù)字。
is_from_range(from, to)是否from <= ch <= to。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("   AbcDeF GHIJklmn      ");
    cout << "Input String: <" << s << '>' << endl;
    cout << '<' << boost::algorithm::trim_left_copy(s) << '>' << endl;
    cout << '<' << boost::algorithm::trim_right_copy(s) << '>' << endl;
    cout << '<' << boost::algorithm::trim_copy(s) << '>' << endl;
    cout << endl;
    string s1("==ABCD Efgh=IJK==-==   ");
    cout << "Input String: <" << s1 << '>' << endl;
    cout << '<' << boost::algorithm::trim_copy_if(s, boost::algorithm::is_any_of(" -=")) << '>' << endl;
}
    輸出結(jié)果:
    Input String: <   AbcDeF GHIJklmn      >
    <AbcDeF GHIJklmn      >
    <   AbcDeF GHIJklmn>
    <AbcDeF GHIJklmn>
    Input String: <==ABCD Efgh=IJK==-==   >
    <AbcDeF GHIJklmn>

匹配比較

starts_with(s, sub) s是否以sub開頭, 即前綴。
ends_with(s, sub) s是否以sub結(jié)尾, 即后綴。
contains(s, sub) s是否包含sub。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("abcdefGHIJKLMN");
    cout << boost::algorithm::starts_with(s, "abcd") << endl;
    cout << boost::algorithm::starts_with(s, "abcD") << endl;
    cout << boost::algorithm::ends_with(s, "MN") << endl;
    cout << boost::algorithm::ends_with(s, "mn") << endl;
    cout << boost::algorithm::contains(s, "efG") << endl;
    cout << boost::algorithm::contains(s, "WWW") << endl;
}
輸出結(jié)果:
1
0
1
0
1
0

分割字符串

  • Boost庫提供了split算法,根據(jù)指定的字符集合對(duì)字符串進(jìn)行分割。

例子:

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string s("abc 123 cde");
    vector<string> sVec;
    boost::algorithm::split(sVec, s, boost::algorithm::is_space());
    for (auto& str : sVec)
    {
        cout << str << endl;
    }
    cout << "--------分割線--------" << endl;
    s = " abc 123 cde   ";
    boost::algorithm::split(sVec, s, boost::algorithm::is_space());
    for (auto& str : sVec)
    {
        cout << str << endl;
    }
    cout << "--------分割線--------" << endl;
    s = "--abc 123--cde-";
    boost::algorithm::split(sVec, s, boost::algorithm::is_any_of(" -"));
    for (auto& str : sVec)
    {
        cout << str << endl;
    }
}
輸出結(jié)果:
abc
123
cde
--------分割線--------
//空行
abc
123
cde
//空行
//空行
//空行
--------分割線--------
//空行
//空行
abc
123
//空行
cde
//空行
  • 注: boost的很多(但不是全部)字符串算法都帶有忽略大小寫的版本,相差只是以'i'開頭。

正則表達(dá)式

簡介

簡單地說,Boost提供了三個(gè)類型三個(gè)算法來處理正則表達(dá)式:

  • 三個(gè)類型
    • 正則表達(dá)式使用boost::regex來表示。
    • 正則表達(dá)式的匹配的子串結(jié)果使用boost::smatchboost::sub_match來表示。
  • 三個(gè)算法
    • 判斷整個(gè)字符串是否與正則表達(dá)式匹配:boost::regex_match()
    • 在字符串中搜索與正則表達(dá)式匹配的子串:boost::regex_search()
    • 替換掉字符串中所有與正則表達(dá)式匹配的字串:boost::regex_replace()

關(guān)于正則表達(dá)式的學(xué)習(xí),可以參考這篇文章

例子

** 下面通過例子和注釋簡單說明其用法。**

#include <boost/regex.hpp>
#include <iostream>
#include <string>
using namespace std;
int main()
{
    boost::regex rgx("(\\w+)\\s(\\w+)"); 
    string s("abcd efgh");
    // boost::regex_match() 當(dāng)字符串和正則表達(dá)式<完全匹配>的時(shí)候返回true,
    // 否則返回false。
     cout << boost::regex_match(s, rgx) << endl; 
     cout << "========分割線========" << endl;
     // boost::regex_search() 找到第一個(gè)和正則表達(dá)式匹配的子串則返回true,
     // 具體匹配子串的信息存放在boost::smatch類型的參數(shù)里。否則返回false。
     // boost::smatch實(shí)際上是持有boost::sub_match的元素的容器。
     // boost::sub_match繼承自類std::pair,
     // 對(duì)應(yīng)的匹配子串由first和second成員表示:[first, second)。
     boost::smatch result;
     if (boost::regex_search(s, result, rgx))
     {
         for (size_t i = 0; i < result.size(); ++i)
        {
            //result[0] 正則表達(dá)式的匹配結(jié)果。
            //result[1] 第一個(gè)分組的匹配結(jié)果。
            //result[2] 第二個(gè)分組的匹配結(jié)果。
            cout << result[i] << endl;
         }
     }
     cout << "========分割線========" << endl;
 
     rgx = "(\\w+)\\s\\w+";
     if (boost::regex_search(s, result, rgx))
     {
         for (size_t i = 0; i < result.size(); ++i)
         {
             //result[0] 正則表達(dá)式的匹配結(jié)果
             //result[1] 分組的匹配結(jié)果
             cout << result[i] << endl;
         }
     }
     cout << "========分割線========" << endl;
 
     rgx = "\\w+\\s(\\w+)";
     if (boost::regex_search(s, result, rgx))
     {
         for (size_t i = 0; i < result.size(); ++i)
         {
            cout << result[i] << endl;
         }
     }
     cout << "========分割線========" << endl;
     rgx = "\\w+\\s\\w+";
     if (boost::regex_search(s, result, rgx))
     {
         for (size_t i = 0; i < result.size(); ++i)
         {
              cout << result[i] << endl;
          }
      }
      cout << "========分割線========" << endl;
      rgx = "(\\d+)\\s(\\w+)";
      if (boost::regex_search(s, result, rgx))
      {
         for (size_t i = 0; i < result.size(); ++i)
         {
             cout << result[i] << endl;
         }
      }
      cout << "========分割線========" << endl;
      // 遍歷正則匹配整個(gè)字符串。
      s = "abcd efgh ijk www";
      rgx = "\\w+\\s\\w+";
      auto begin = s.cbegin();
      auto end = s.cend();
      while (boost::regex_search(begin, end, result, rgx))
      {
           cout << result[0] << endl;
           begin = result[0].second;
      }
      cout << "========分割線========" << endl;

    // boost::regex_replace() 替換掉字符串中<所有>匹配的子串。

    //結(jié)果輸出到一個(gè)Output Iterator。
     boost::regex_replace(std::ostreambuf_iterator<char>(std::cout), s.cbegin(), s.cend(), rgx, "666666");
     cout << endl;
      //直接返回結(jié)果
     cout << boost::regex_replace(s, rgx, "2233333") << endl; //每一個(gè)匹配
}

輸出結(jié)果:
1
========分割線========
abcd efgh
abcd
efgh
========分割線========
abcd efgh
abcd
========分割線========
abcd efgh
efgh
========分割線========
abcd efgh
========分割線========
========分割線========
abcd efgh
ijk www
========分割線========
666666 666666
2233333 2233333
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容