C++ 数组的不确定大小

C++ 数组的不确定大小,c++,arrays,C++,Arrays,我试着制作一个简单的程序,计算用户名的元音和辅音的数量。数组的大小取决于用户名的字母数。我正在使用队列显示字母。当我运行程序时,.Exe文件崩溃。所以我尝试将数组大小改为一个数字而不是一个变量,结果成功了。我认为,问题在于使用一个变量来表示数组的大小。有没有办法解决这个问题?这样我仍然可以使用一个变量作为数组的大小。这是我的密码 #include <iostream> #include <queue> using namespace std; int main() {

我试着制作一个简单的程序,计算用户名的元音和辅音的数量。数组的大小取决于用户名的字母数。我正在使用队列显示字母。当我运行程序时,.Exe文件崩溃。所以我尝试将数组大小改为一个数字而不是一个变量,结果成功了。我认为,问题在于使用一个变量来表示数组的大小。有没有办法解决这个问题?这样我仍然可以使用一个变量作为数组的大小。这是我的密码

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    int i;
    char bin[i];
    queue<char> name;
    int v = 0, c = 0;

    cout << "how many letters does your name have?:";
    cin >> i;
    cout << "Enter the letters of your name one by one:\n";

    do {
        for (int k = 0; k < i; k++) {
            cout << " ";
            cin >> bin[k];
            name.push(bin[k]);

            if (bin[k] == 'a' || bin[k] == 'A') {
                v++;
            }
            if (bin[k] == 'e' || bin[k] == 'E') {
                v++;
            }
            if (bin[k] == 'i' || bin[k] == 'I') {
                v++;
            }
            if (bin[k] == 'o' || bin[k] == 'O') {
                v++;
            }
            if (bin[k] == 'u' || bin[k] == 'U') {
                v++;
            }
            if (bin[k] == 'b' || bin[k] == 'B') {
                c++;
            }
            if (bin[k] == 'c' || bin[k] == 'C') {
                c++;
            }
            if (bin[k] == 'i' || bin[k] == 'D') {
                c++;
            }
            if (bin[k] == 'f' || bin[k] == 'F') {
                c++;
            }
            if (bin[k] == 'g' || bin[k] == 'G') {
                c++;
            }
            if (bin[k] == 'h' || bin[k] == 'H') {
                c++;
            }
            if (bin[k] == 'j' || bin[k] == 'J') {
                c++;
            }
            if (bin[k] == 'k' || bin[k] == 'K') {
                v++;
            }
            if (bin[k] == 'l' || bin[k] == 'L') {
                v++;
            }
            if (bin[k] == 'm' || bin[k] == 'M') {
                c++;
            }
            if (bin[k] == 'n' || bin[k] == 'N') {
                c++;
            }
            if (bin[k] == 'P' || bin[k] == 'p') {
                c++;
            }
            if (bin[k] == 'q' || bin[k] == 'Q') {
                c++;
            }
            if (bin[k] == 'r' || bin[k] == 'R') {
                c++;
            }
            if (bin[k] == 's' || bin[k] == 'S') {
                c++;
            }
            if (bin[k] == 't' || bin[k] == 'T') {
                c++;
            }
            if (bin[k] == 'v' || bin[k] == 'V') {
                c++;
            }
            if (bin[k] == 'w' || bin[k] == 'W') {
                c++;
            }
            if (bin[k] == 'x' || bin[k] == 'X') {
                c++;
            }
            if (bin[k] == 'y' || bin[k] == 'Y') {
                c++;
            }
            if (bin[k] == 'z' || bin[k] == 'Z') {
                c++;
            }
        }
    } while (bin[100] != '1');

    cout << "\n\nYour name is:\n";
    for (queue<char> run = name; !run.empty(); run.pop()) {
        cout << " " << run.front() << endl;
    }
    cout << "\nVowels= " << v;
    cout << "\nConsonants= " << c << "\n";

    cout << "\n\n\n\n";

    system("PAUSE");
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
int i;
char-bin[i];
队列名称;
int v=0,c=0;
cout>i;
库特宾[k];
名称.推送(bin[k]);
if(bin[k]='a'| | bin[k]=='a'){
v++;
}
if(bin[k]=“e”| bin[k]=“e”){
v++;
}
if(bin[k]=“i”| bin[k]=“i”){
v++;
}
if(bin[k]='o'| bin[k]='o'){
v++;
}
if(bin[k]='u'| bin[k]='u'){
v++;
}
if(bin[k]='b'| bin[k]='b'){
C++;
}
if(bin[k]=“c”| bin[k]=“c”){
C++;
}
if(bin[k]=“i”| bin[k]=“D”){
C++;
}
if(bin[k]='f'| bin[k]='f'){
C++;
}
if(bin[k]=“g”| bin[k]=“g”){
C++;
}
if(bin[k]=“h”| bin[k]=“h”){
C++;
}
if(bin[k]='j'| bin[k]='j'){
C++;
}
if(bin[k]='k'| bin[k]='k'){
v++;
}
if(bin[k]='l'| bin[k]='l'){
v++;
}
if(bin[k]=“m”| bin[k]=“m”){
C++;
}
if(bin[k]='n'| bin[k]='n'){
C++;
}
if(bin[k]='P'| bin[k]='P'){
C++;
}
if(bin[k]=“q”| bin[k]=“q”){
C++;
}
if(bin[k]='r'| bin[k]='r'){
C++;
}
if(bin[k]='s'| | bin[k]='s'){
C++;
}
if(bin[k]=“t”| bin[k]=“t”){
C++;
}
if(bin[k]='v'| | bin[k]='v'){
C++;
}
如果(bin[k]='w'| bin[k]='w'){
C++;
}
if(bin[k]='x'| | bin[k]=='x'){
C++;
}
if(bin[k]='y'| bin[k]='y'){
C++;
}
if(bin[k]='z'| | bin[k]=='z'){
C++;
}
}
}而(bin[100]!=“1”);

cout您的代码具有未定义的行为<代码>inti
创建名为
i
的未初始化
int
。然后在
char-bin[i]中使用未初始化的垃圾变量。现在我们有一个未定义大小的数组


现在我们不能再往前走了。一旦调用了未定义的行为,我们就无法再推理代码应该如何工作。如果您需要一个数组,并且在运行时之前不知道数组的大小,那么您应该使用,并且代码具有未定义的行为<代码>inti
创建名为
i
的未初始化
int
。然后在
char-bin[i]中使用未初始化的垃圾变量。现在我们有一个未定义大小的数组


现在我们不能再往前走了。一旦调用了未定义的行为,我们就无法再推理代码应该如何工作。如果你需要一个数组,你不知道运行的大小是什么,那么你应该使用一个和

请忽略DO,而函数ISO C++不包含可变长度数组。C++编译器支持C的VLAS作为扩展。即使在支持扩展的C(或C++编译器)中,可变长度数组的使用是无效的。请忽略DO,而函数ISO C++不包含可变长度数组。一些C++编译器确实支持C的VLAS作为扩展。即使在支持扩展的C(或C++编译器)中,可变长度数组的使用是无效的。有点挑剔,但不调用UB使整个程序无法推理?不仅仅是调用和超越。编译器可能会做一些有趣的事情等。为什么向量或队列?std::string可以解决他的问题同意NathanOliver的意见,如果编译器没有打开警告和错误检查级别,则必须对此向您发出警告。@Ilja AFAIK您可以对程序进行推理,直到达到未定义的行为为止。一旦你遇到它,那么所有的赌注都是无效的。@NathanOliver举例来说,如果它包含UB或几乎任何东西,编译器可能会决定跳过整个块,我想。例如,这意味着无法对UB的“直到点”进行推理。虽然不是100%确定,因为我应该重新阅读标准中关于UB的内容。有点吹毛求疵,但是调用UB不会让整个程序无法推理吗?不仅仅是调用和超越。编译器可能会做一些有趣的事情等。为什么向量或队列?std::string可以解决他的问题同意NathanOliver的意见,如果编译器没有打开警告和错误检查级别,则必须对此向您发出警告。@Ilja AFAIK您可以对程序进行推理,直到达到未定义的行为为止。一旦你遇到它,那么所有的赌注都是无效的。@NathanOliver举例来说,如果它包含UB或几乎任何东西,编译器可能会决定跳过整个块,我想。例如,这将意味着该区块无法