2011-11-15 45 views
1

我有應該字符串分成3個長度段代碼:我需要更多空間嗎?

ABCDEFG應ABC DEFģ

然而,我有一個非常長的字符串和我不斷收到

終止調用時沒有活動異常

當I C把弦的長度放下來,它似乎工作。我需要更多空間嗎?我想在使用字符串時我不必擔心空間。

int main() 
{ 
    string code, default_Code, start_C; 
    default_Code = "TCAATGTAACGCGCTACCCGGAGCTCTGGGCCCAAATTTCATCCACT";   
    start_C  = "AUG"; 

    code   = default_Code; 

    for (double j = 0; j < code.length(); j++) { //insert spacing here 
     code.insert(j += 3, 1, ' '); 
    } 
    cout << code; 

    return 0; 
} 

回答

2

想一想code.length()== 2的情況。你在字符串的某處插入一個空格。我不確定,但如果for(int j=0; j+3 < code.length(); j++)可以。

+0

你是炸彈! ED。在一個簡要說明中,我是否應該將double j更改爲int j? – user1046825

+0

@ user1046825:將其更改爲「int」而不是「unsigned int」,字符串的長度永遠不會是您所比較的「double」。此外,問題與答案中引用的完全相同,你的'string :: insert()'會拋出一個'out_of_range'異常(插入的位置超過了字符串的長度),這是你不捕獲的,因此異常終止。 –

+0

@ user1046825,是的,你應該:整數數學比浮點數學更快,並且在某個時候加1爲1將不會做任何事情。當你在那裏時,如果它解決了你的問題,不要忘了點擊答案左邊的複選標記。 – zneak

2

這是一些相當混亂的代碼。您正在循環一個字符串並循環,直到達到字符串的末尾。但是,在循環內部,不僅可以修改要循環的字符串,還可以在您說j + = 3時更改循環變量。

它恰好適用於任何字符串,其中包含3個字母的倍數,但你沒有正確處理其他案件。

這裏的for循環工作的例子,是一個比較明顯的是它在做什麼:

// We skip 4 each time because we added a space. 
for (int j = 3; j < code.length(); j += 4) 
{ 
    code.insert(j, 1, ' '); 
} 
+0

非常感謝!我可以打擾您另一個問題,我一直在努力了一個多星期嗎? – user1046825

+0

如果您不介意...我現在必須重複該代碼2次,但是我必須在每次執行該操作時都將第一個字母「砍」掉...... – user1046825

+0

這應該是一個相當類似的解決方案,除了你現在需要在移除角色時小心你的循環計數器。 – shenles

0

您使用的是非常低效的方法做這樣的操作。每次插入空間時,都會將字符串的剩餘部分向前移動,這意味着您需要的操作總數大約爲o(n**2)

您可以改爲通過使用可讀寫的方式做到這一點transormation與單一o(n)通:

// input string is assumed to be non-empty 
std::string new_string((old_string.size()*4-1)/3); 
int writeptr = 0, count = 0; 
for (int readptr=0,n=old_string.size(); readptr<n; readptr++) { 
    new_string[writeptr++] = old_string[readptr]; 
    if (++count == 3) { 
     count = 0; 
     new_string[writeptr++] = ' '; 
    } 
} 

類似的算法也可以寫入工作「就地」,而不是創建一個新的字符串,只需您必須首先放大該字符串,然後再後退。

請注意,儘管對於一個字符串來說,你不需要關心分配和釋放,但是對於字符串對象的大小還是有限制的(即使可能你沒有擊中它們...你的版本是如此之慢,以至於在現代計算機上到那個地步要花上一段時間)。