2016-04-13 125 views
-3

我相信我所做的一切都是正確的,但字符串沒有被分配的字符填充。這是我通過測試得知的:random是正確的字符,q是正確的int,s [i] .name是一個字符串。我曾嘗試使用.at(q)和[q],但沒有任何工作。at()在函數中不起作用

這是我的錯誤:在 中止(核心轉儲)

for (int i = 0; i < num; i++) { 
    int q = 0; 
    char random = 50; 
    for (; random != 32;) { 
     file.get(random); 
     s[i].name.at(q) = random; 
     q++; 
    } 
    q = 0; 
} 
cout << s[0].name; 
+1

它看起來像(我),就像你試圖給一個rval分配一個'char'(並且rval不存在)。 –

+1

根據你的邏輯,'q'可以比s [i] .name'具有更大的值。 –

回答

1

的basic_string ::如果是這樣的:

扔 '的std :: out_of_range' 什麼()的一個實例後終止叫所有的代碼,它崩潰了,因爲名字沒有在任何地方分配內存。呼叫at要求至少有許多元素已經分配給它工作。嘗試調用push_back來代替,這將在字符串的後面添加元素,並在必要時擴展它。

此外,for的最後一行是多餘的,將q設置爲0沒有意義,因爲它在下一行被破壞,並且新的q在下一個循環中被分配。更不用說,使用push_back時,跟蹤q的索引變得完全多餘。 最後,爲了使事情變得不必要的複雜,在這種情況下使用。

+0

謝謝,我忽略了一個簡單的錯誤。 – Dent

0

這是困難的,因爲你沒有給我們完整的代碼,但如果我理解你的意圖,你應該能夠得到類似的東西與此:

for (int i = 0; i < num; i++) { 
    char random = 50; 
    s[i].name = ""; 
    for (; random != 32;) { 
     file.get(random); 
     s[i].name += random; 
    } 
} 
cout << s[0].name; 

如果字符串太短,at()會拋出異常。像我一樣使用連接應該處理任意大的字符串。