簡體   English   中英

替換為字符串迭代(out_of_range)

[英]Replace in string iteration (out_of_range)

我編寫了一個對字符串進行百分比編碼的函數,如下所示:

string percent_encode(string str)
{
  string reserved =
    // gen-delims
    ":/?#[]@"
    // sub-delims
    "!$&'()*+,;="
  ;

  for(string::iterator i = str.begin(); i < str.end(); i++) {
    int c = *i;
    // replaces reserved, unreserved non-ascii and space characters.
    if(c > 127 || c == 32 || reserved.find(*i) != string::npos) {
      std::stringstream ss;
      ss << std::hex << c;
      str.replace(i, i + 1, "%" + ss.str());
    }
  }
  return str;
}

當我為“ a&b”之類的字符串調用此函數時,將拋出out_of_range異常:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::replace

我使用調試器跟蹤了此異常,發現替換效果很好,但是它以某種方式迭代了end();

這是我看到迭代器“ i”時得到的:

{_M_current = 0x7fc43d61bd78 "a&b"}
{_M_current = 0x7fc43d61bd79 "&b"}
{_M_current = 0x7fc43d61bd7a "b"}
{_M_current = 0x7fc43d61bd7b ""}
{_M_current = 0x7fc43d61bd7c "o = a&b\n"}
{_M_current = 0x7fc43d61bd7d " = a&b\n"}

然后,它嘗試替換“ =”,並以out_of_range異常失敗。 我不明白,迭代器如何有可能明顯超出end()。

如果有人可以向我解釋,我將不勝感激,因為我無法在網絡上找到遇到相同問題的人。

謝謝並恭祝安康,

復活

編輯:

啊,我真的覺得很復雜。 x)這就是我現在解決的方式。

string percent_encode(string str)
{
  string reserved =
    // gen-delims
    ":/?#[]@"
    // sub-delims
    "!$&'()*+,;="
  ;

  std::stringstream ss;

  for(string::iterator i = str.begin(); i < str.end(); i++) {
    // encodes reserved, unreserved non-ascii and space characters.
    int c = *i;
    if(c > 126 || c == 32 || reserved.find(*i) != string::npos) {
      ss << '%' << std::hex << c;
    } else {
      ss << *i;
    }
  }

  return ss.str();
}

謝謝迭戈:)

replace使當前的迭代器無效,因此它可能會超出結尾。

有幾種正確編寫此代碼的方法。 例如,生成(並返回)新字符串會更容易,甚至可能更有效(請注意,replace也必須將字符串的其余部分移動一個位置)。 同樣,使用更新的字符串長度和帶有索引的位置進行播放。

但是 ,我想到的最好是返回一個全新的字符串。 功能更多:)

問題是您在迭代str時更改了str。 更改字符串的內容時,迭代器無效。 解決方案是使用包含轉換結果的字符串的另一個副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM