2012-03-29 6 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

+0

+1、短い完全なテストケースを含む。 http://sscce.org –

答えて

0

あなたは混同ijを得た:

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

また、あなたは外側のループの最後で、delete elementToBeAdded;を記憶しなければならない漏れています。あなたは

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

にタイプミスがあるため

6

あなたは私は、jはない意味します。

+1

+1を参照してください。また、「new」はすべて「delete」で処理する必要があります。 – Mahesh

2

あなたの最も内側のループは、それが確実にjを使用しようとするときiを使用している:

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

結果として、あなたはRecord#1のchar[]の0番目の要素、またの1番目の要素を設定することは決してないだろう#2などです。つまり、最初のものを除く最も外側のループを通過するたびに、ホテル名の最初の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]でなければなりません。

関連する問題