Сбой инициализации строки - PullRequest
2 голосов
/ 29 марта 2012

Это моя программа. Вывод должен быть последовательностью символов «а», но по какой-то причине это не так. Почему?

#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";
    }
}

Ответы [ 6 ]

6 голосов
/ 29 марта 2012

Поскольку у вас есть опечатка в

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

Вы имеете в виду j, а не я.

2 голосов
/ 29 марта 2012

Ваш самый внутренний цикл использует i, когда он, безусловно, намеревается использовать j:

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

, в результате вы никогда не установите нулевой элемент Record # 1 char[], ни один из элементов Record # 2 и т. д. Это означает, что каждый раз, когда в самом внешнем цикле, кроме первого, самый первый char в названии отеля будет оставаться неинициализированным, очень возможно \0.

Кроме того, создаваемые вами Record объекты никогда не удаляются, поэтому происходит утечка памяти на каждой итерации.

1 голос
/ 30 марта 2012

Поскольку в вашем исходном коде есть неправильное написание:

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

индекс должен быть [j] здесь.

1 голос
/ 29 марта 2012

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

должно быть

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

0 голосов
/ 30 марта 2012

Теперь, когда вы знаете ошибку, используйте 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;
} 
0 голосов
/ 29 марта 2012

Вы получили i и j перепутали:

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

Вы также теряете память, вы должны delete elementToBeAdded; в конце внешнего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...