«Для l oop» выходит после 3 итераций - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь написать код для ввода 'n' количества предложений и сохранить его в array. Мой for loop выходит на 4-й итерации? Кто-нибудь может мне помочь?

int main(){

cout<<"Enter the number of sentences: ";
int n;
cin>>n;
cin.ignore();
char *array[50];
int br;

for (int i = 0; i<n; i++)
{
    char* sentence = new char();
    cout<<"Enter "<<i+1<<" sentence: ";
    cin.getline(sentence,50);
    br=0;
    while(*sentence != '\0')
    {
        br++;
        sentence++;
    }
    sentence=sentence-br;
    for(int j=0; j<br; j++)
    {
        array[i][j] = sentence[j];
    }

delete sentence;
}

for(int i=0; i<n;i++)
{   
    cout<<array[i]<<endl;   
}

delete[] array;

return 0;
}

Ответы [ 2 ]

1 голос
/ 31 марта 2020
char* sentence = new char();
cout<<"Enter "<<i+1<<" sentence: ";
cin.getline(sentence,50);

Это выделяет место только для одного char, но вы пытаетесь записать до 50 char с в эту память. Доступ к памяти, которой вы не владеете, приводит к тому, что поведение вашей программы не определено.

for(int j=0; j<br; j++)
{
    array[i][j] = sentence[j];
}

При попытке скопировать первые br символов из sentence в array[i], но array заполнен неинициализированных указателей. Разыменование неинициализированного указателя приводит к неопределенному поведению, а затем попытка записи в память, на которую он «указывает», является более неопределенным поведением.

delete[] array;

В конце вашей программы вы пытаетесь освободить память, выделенную для array, но вы не распределили эту память через new. Еще раз, неопределенное поведение. array имеет автоматическое c время хранения, поэтому его память будет автоматически освобождена, когда он выйдет из области видимости; вы не должны пытаться освободить его с помощью delete.


Вместо сочетания стати c массивов и динамического c управления памятью, вы должны использовать std::vector<std::string>. Это сделает все управление памятью за вас:

#include <iostream>
#include <string>
#include <vector>

int main()
{

    std::cout << "Enter the number of sentences: ";
    int n;
    std::cin >> n;
    std::cin.ignore();
    std::vector<std::string> array(n);

    for (int i = 0; i < n; i++) {
        std::cout << "Enter " << i + 1 << " sentence: ";
        std::getline(std::cin, array[i]);
    }

    for (int i = 0; i < n; i++) {
        std::cout << array[i] << std::endl;
    }
}
0 голосов
/ 31 марта 2020

Спасибо за предложение, но мне не разрешено использовать библиотеку строк или cstring, я пытался кодировать с нуля и думаю, что получил.

int main(){

cout<<"Enter the number of sentences: ";
int n;
cin>>n;
cin.ignore();
char** array = new char*[n];


for (int i = 0; i<n; i++)
{
    cout<<"Enter "<<i+1<<" sentence: ";
    array[i] = new char[50];
    cin.getline(array[i],50);

}

for(int i=0; i<n;i++)
{   
    cout<<array[i]<<endl;   
}

for(int i = 0; i<n; i++)
{
    delete [] array[i];
}
delete [] array;

return 0;
}

Выделил ли я память право?

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