2015-09-19 24 views
-2
cin >> n; 
    string disks;                                   
    for(i=0; i < n; i++){ 
     disks[2*i] = 1; 
     disks[2*i+1] = 0; 
    } 

這樣說:string subscript out of range。即使我將其更改爲(n-1)。我試圖想到一個非常簡單的方法來將其設置爲交替10 s,我無法找到它!循環更改字符串保持失敗?

這個循環爲什麼會導致錯誤?

+4

'disks'是一個空字符串。 '磁盤[我]'是無效的(索引超出界限)的任何值'我'。 –

+0

爲什麼你使用'std :: string',而不是說'std :: bitset'或者'std :: vector ',用於存儲位呢?字符串被設計用於存儲字符。 –

回答

1

當一個std :: string是默認構造它是空的;由於底層存儲尚未分配,因此您無法開始寫入。

取而代之的是,使用string disks(n * 2, '0');來初始化字符串,其空間爲2 * n個字符。它將預填充'0'(零),然後你所要做的就是通過並填寫那些。

cin >> n; 
string disks(n * 2, '0'); 
for (int i = 0; i < n; i++) 
    disks[2 * i] = '1'; 

另外請注意,您需要使用'0''1'得到實際的字符值。

0

當你定義一個沒有初始值的字符串時,你不能訪問它,在你的例子中使用operator[]。所以,行:

disks[2*i] = 1; 
    disks[2*i+1] = 0; 

導致錯誤,因爲您試圖訪問一個不存在的索引。

如果你想一個值賦給一個字符串使用串聯:

disks += "0" + "1"; 

push_back()append()。指定值的順序將確定哪些位於偶數和奇數索引處。