2012-03-29 69 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]在这里。