2012-03-29 224 views
2

這是我的程序。輸出應該是一個'a'字符序列,但由於某種原因,它不是。爲什麼?字符串初始化失敗

#include <iostream> 

using namespace std; 

const int NAME_LENGTH = 16; 

struct Record { 
    char hotel_name[NAME_LENGTH]; 
}; 

int main() { 
    int amount = 5; 
    for (int i = 0; i < amount; i++) { 
     Record * elementToBeAdded = new Record; 
     for (int j = 0; j < NAME_LENGTH; j++)  
      elementToBeAdded->hotel_name[i] = 'a'; 
     elementToBeAdded->hotel_name[NAME_LENGTH-1] = '\0'; 
     cout << "string-" << elementToBeAdded->hotel_name << "-\n\n"; 
    } 
} 
+0

然後你的輸出是什麼? – talnicolas 2012-03-29 19:52:08

+0

+1包括一個簡短的完整測試用例。請參閱http://sscce.org – 2012-03-29 20:15:20

回答

0

你有ij混合起來:

for (int j = 0; j < NAME_LENGTH; j++)  
    elementToBeAdded->hotel_name[i] = 'a'; //<-- should be j here 

你也泄漏內存,你應該delete elementToBeAdded;在外部循環結束。

6

因爲你身上有

 elementToBeAdded->hotel_name[i] = 'a'; 

一個錯字你的意思是Ĵ,而不是我。

+1

+1同樣每個'new'都應該用'delete'來處理。 – Mahesh 2012-03-29 19:55:45

2

你最內層的循環使用i時,它肯定打算用j

elementToBeAdded->hotel_name[i] = 'a'; 

結果,你永遠不會設置Record#1的char[],零元素,也不是一個個元素Record#2's等。這意味着每次通過除第一個外的最外層循環時,酒店名稱中的第一個char將保持未初始化,很可能是\0

此外,您創建的Record對象永遠不會被刪除,因此每次迭代都會泄漏內存。

1

elementToBeAdded->hotel_name[i] = 'a';

應該

elementToBeAdded->hotel_name[j] = 'a';

0

現在你知道了錯誤,請使用std::fill_n反而是在算法頭。

#include <algorithm> 

// ..... 

for (int i = 0; i < amount; i++) {   

    Record * elementToBeAdded = new Record; 
    std::fill_n(elementToBeAdded->hotel_name, NAME_LENGTH-2, 'a'); 
    elementToBeAdded->hotel_name[NAME_LENGTH-1] = '\0';   

    cout << "string-" << elementToBeAdded->hotel_name << "-\n\n"; 
    delete elementToBeAdded; 
} 
1

因爲有一個誤拼寫在上述源代碼:

for (int j = 0; j < NAME_LENGTH; j++)  
    elementToBeAdded->hotel_name[i] = 'a'; 

的指數應[J]在這裏。