C ++ проблема с новым символом [] - PullRequest
0 голосов
/ 22 января 2019

Может кто-нибудь объяснить мне, почему на вкладке char [4] есть 4 дополнительных слота, когда я спросил только 3? Как от них избавиться? Я пишу код в Visual Studio 2017. Редактировать: первая программа была очень простой и не показала то, что я хотел. Итак, есть расширенный.

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int i, n;
    vector<char> input;
    char chp;
    cout << "Enter a expression" << endl;
    while (1)
    {
        cin.get(chp);
        if (chp == '\n') break;
        input.push_back(chp);
    }
    n = input.size();
    char* tab = new char[n] {};
    for (i = 0; i < n; i++)
    {
        tab[i] = input[i];
    }
    int l = strlen(tab);
    for (int i = 0; i < l; i++) 
    {
        cout << "tab[" << i << "] is " << tab[i] << endl;
    }
    cin.get();
}

Результат в окне консоли аналогичен, когда я ввожу "3 + 3"

Вкладка [0] равна 3
вкладка [1] + + 1008 * вкладка [2] 3
вкладка [3] ř
вкладка [4] - это
вкладка [5] ř
вкладка [6] ř

Это еще не полная программа (полная программа - это калькулятор, который вычисляет любое математическое выражение и намного длиннее). Я писал, что в C давно и в C динамические массивы не являются такой проблемой.

Кроме того, как насчет многомерных массивов? Может ли струна быть решением и для них?

1 Ответ

0 голосов
/ 22 января 2019

Может кто-нибудь объяснить мне, почему на вкладке char [4] есть 4 дополнительных слота, когда я просил только 3?

Нет.Массив имеет только 3 элемента.

Проблема в том, что элементы массива имеют неопределенные значения.В результате передачи указателя на массив неопределенных значений в strlen поведение вашей программы не определено.

Решение: Инициализируйте ваш массив.Кроме того, инициализируйте его так, чтобы он содержал нулевой терминатор, как того требует strlen:

char* tab = new char[3]{'a', 'b', '\0'};

В качестве альтернативы нулевому завершению, не используйте strlen для получения длины.Вы уже знаете, что массив содержит 3 элемента.Но значения должны быть инициализированы до того, как вы вставите их в выходной поток.

PS Не забудьте удалить выделенную память:

delete[] tab;
...