2015-08-21 82 views
1

我正在閱讀一本編碼面試書,並遇到一個問題:用'%20'替換字符串中的所有空格使用「%20」替換空格 - 字符串下標超出範圍

我試着在我的編譯器中運行這個解決方案,但得到這個錯誤:字符串下標超出範圍。所以,我查找了該錯誤的stackoverflow,並得到了一個解決方案,試圖追加新的字符+ =,而不是隻給字符串分配新的字符,但仍然產生相同的錯誤。

這是我的代碼。非常感謝您的時間!

void replaceSpaces(string &str) 
{ 
    int spaces = 0; 

    // Count number of spaces in original string 
    for (int i = 0; i < str.size(); i++) 
    { 
     if (str[i] == ' ') 
      spaces++; 
    } 

    // Calculate new string size 
    int newSize = str.size() + (2 * spaces); 
    str.resize(newSize); // thanks Vlad from Moscow 

    // Copy the chars backwards and insert '%20' where needed 
    for (int i = str.size() - 1; i >= 0; i--) 
    { 
     if (str[i] == ' ') 
     { 
      str[newSize - 1] = '0'; // += '0' didnt work 
      str[newSize - 2] = '2'; // += didnt work 
      str[newSize - 3] = '%'; // same 
      newSize = newSize - 3; 
     } 
     else 
     { 
      str[newSize - 1] = str[i]; // same 
      newSize--; 
     } 
    } 
} 

int main() 
{ 
    string test = "sophisticated ignorance, write my curses in cursive"; 
    replaceSpaces(test); 
    cout << test << endl; 
} 
+0

哪條線給出了超出範圍的錯誤?當你在一個調試器中遍歷你的代碼時,在發生這種情況之前變量的值是什麼? – Angew

+1

爲什麼不使用STL字符串查找和替換? –

+0

因教育目的 – Toumash

回答

2

您沒有調整字符串str的大小。

您設置得比str.size()變大newSize

int newSize = str.size() + (2 * spaces); 

str

str[newSize - 1] = str[i]; 

使用它像一個指數至少你可以在第一

str.resize(newSize); 

寫在這裏是一個演示程序,顯示功能如何寫

#include <iostream> 
#include <string> 

std::string & replaceSpaces(std::string &s) 
{ 
    std::string::size_type spaces = 0; 

    // Count number of spaces in original string 
    for (char c : s) if (c == ' ') ++spaces; 

    if (spaces != 0) 
    { 
     auto i = s.size(); 
     // Calculate new string size 
     auto j = s.size() + 2 * spaces; 
     s.resize(j); 

     // Copy the chars backwards and insert '%20' where needed 
     while (i != j) 
     { 
      if (s[--i] == ' ') 
      { 
       s[--j] = '0'; 
       s[--j] = '2'; 
       s[--j] = '%'; 
      } 
      else 
      { 
       s[--j] = s[i]; 
      } 
     } 
    } 

    return s; 
}  

int main() 
{ 
    std::string test = "sophisticated ignorance, write my curses in cursive"; 

    std::cout << "\"" << test << "\"\n"; 
    std::cout << "\"" << replaceSpaces(test) << "\"\n"; 
} 

程序輸出是

"sophisticated ignorance, write my curses in cursive" 
"sophisticated%20ignorance,%20write%20my%20curses%20in%20cursive" 

編輯:後您插入語句resize我在環

for (int i = str.size() - 1; i >= 0; i--) 
    ^^^^^^^^^^^^^^^^^^^^^^ 

變量i然後勸必須初始化與調整大小之前的字符串的舊大小。

+0

感謝您的回覆!試過str.resize(newSize);但仍然沒有工作 –

+0

@Harold Finch查看我更新的帖子。 –

0

如果你正在尋找一個切實可行的解決方案,但又不過度關注性能,這裏的東西要簡單得多:

void replaceSpaces(string &str) { 
    str = std::regex_replace(str, std::regex(" "), "%20"); 
} 
0

這個怎麼樣?

#include <iostream> 
#include <string> 
std::string replaceSpaces(std::string str) 
{ 
    std::string newStr; 
    for (char c : str) 
    { 
     if (c == ' ') 
      newStr.append("%20"); 
     else 
      newStr.push_back(c); 
    } 
    return newStr; 
} 

int main() 
{ 
    std::string test = "sophisticated ignorance, write my curses in cursive"; 
    std::string newtest = replaceSpaces(test); 
    std::cout << test << std::endl << newtest << std::endl; 
}