新char []的C++问题

-6 c++ char dynamic-tables new-operator

有人可以向我解释,为什么在char tab []中有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();
}
Run Code Online (Sandbox Code Playgroud)

当我输入"3 + 3"时,控制台窗口中的结果类似

选项卡[0]是3
选项卡[1]是+
选项卡[2]是3
选项卡[3]是ř
选项卡[4]是ř
选项卡[5]是ř
选项卡[6]是ř

这还不是完整的程序(完整程序是计算器,计算任何数学表达式,并且更长).我很久以前在C中写过,而在C中,动态数组并不是这样的问题.

那么,多维数组怎么样?字符串也可以成为他们的解决方案吗?

eer*_*ika 6

有人可以向我解释,为什么在char tab []中有4个额外的插槽,当我只询问3个?

没有.该数组只有3个元素.

问题是您的数组元素具有不确定的值.将指针传递给不确定值数组的结果是strlen,程序的行为是未定义的.

解决方案:初始化阵列.此外,初始化它以使其包含空终止符,如下所示strlen:

char* tab = new char[3]{'a', 'b', '\0'};
Run Code Online (Sandbox Code Playgroud)

作为null终止的替代方法,不要strlen用来获取长度.您已经知道该数组包含3个元素.但是,在将值插入输出流之前,仍必须初始化值.

PS别忘了删除你分配的内存:

delete[] tab;
Run Code Online (Sandbox Code Playgroud)