-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中,动态数组并不是这样的问题.
那么,多维数组怎么样?字符串也可以成为他们的解决方案吗?
有人可以向我解释,为什么在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)