簡體   English   中英

新字符 [] 的 C++ 問題

[英]C++ issue with new char[]

有人可以向我解釋一下,當我只要求 3 個時,為什么在 char tab[] 中有 4 個額外的插槽? 如何擺脫它們? 我在 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] 是 +
選項卡 [2] 是 3
制表符 [3] 是 ř
制表符 [4] 是 ř
制表符 [5] 是 ř
制表符 [6] 是 ř

這還不是完整的程序(完整的程序是一個計算器,可以計算任何數學表達式,而且要長得多)。 我很久以前在 C 中寫過,在 C 中動態數組不是這樣的問題。

另外,多維數組呢? 字符串也可以成為他們的解決方案嗎?

有人可以向我解釋一下,當我只要求 3 個時,為什么在 char tab[] 中有 4 個額外的插槽?

沒有。 該數組只有 3 個元素。

問題是您的數組元素具有不確定的值。 由於將指向不確定值數組的指針傳遞給strlen ,程序的行為是未定義的。

解決方案:初始化您的陣列。 此外,按照strlen要求初始化它,使其包含一個空終止符:

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

作為空終止的替代方法,不要使用strlen來獲取長度。 您已經知道該數組包含 3 個元素。 但是在將它們插入輸出流之前,這些值仍然必須被初始化。

PS不要忘記刪除您分配的內存:

delete[] tab;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM