如何确保数组中没有其他内容

时间:2012-10-02 21:22:12

标签: c++ arrays null

我正在为学校做作业,我似乎对阵列中的其他角色有问题。 (除了其他问题......)

在一个函数中,我声明了数组..

const int MAXSIZE = 100;
char inFix[MAXSIZE];

此代码用于将字符放入数组

 //loop to store user input until enter is pressed
    while((inputChar = static_cast<char>(cin.get()))!= '\n')
    {
        //if function to decide if the input should be stored or not
        if(isOperator(inputChar) || isdigit(static_cast<int>(inputChar)) || inputChar == '(' || inputChar == ')')
        {
            inFix[a] = inputChar; //stores input
            a++;
        }

    }

最后,我将空字符附加到数组中,虽然我不确定是否应该这样做:

 inFix[MAXSIZE] = '\0';

或者如果我应该使用strcat ..无论如何...在我的下一个函数中,我使用strcat将括号附加到结尾。

但是我一直遇到代码问题,所以我运行了一个for循环来打印下一个函数开头的infix数组内部的内容,只是为了看...

我得到了这种恼人的哔哔声,还有一串奇怪的人物,比如心灵,音乐标志......以及一整套奇怪的人物。可能是什么问题呢?感谢。

编辑:顺便说一句,我输入9*4,然后在我附加括号后运行for循环,所以在输出的开头,我得到:

9*4)然后是奇数字符串......

4 个答案:

答案 0 :(得分:2)

尝试将'\0'附加到数组中的a位置 - 也就是说,恰好在您读过的最后一个字符之后。否则你将你的角色放在数组中,然后是数组之前的随机序列,然后是\0(或者,在这种情况下,它是数组结束后的一个,更糟糕的是。)

答案 1 :(得分:2)

  

所以我运行了一个for循环来打印下一个函数开头的infix数组内部的内容,只是为了看...

     

我得到了这种恼人的哔哔声,还有一串奇怪的人物,比如心灵,音乐标志......以及一整套奇怪的人物。可能是什么问题?

问题在于您要打印出从未初始化的数组元素。您目前接受的答案建议您初始化所有这些元素。虽然这不会导致错误但是让这个答案阻止您完全理解您遇到的问题是错误的。

重新考虑在数组末尾插入空字符的代码:

inFix[MAXSIZE] = '\0';

你显然知道空字符与标记字符串的结尾有关,但你错误地认为如何正确地做到这一点。从数组的开头到空字符的所有内容都将被视为字符串的一部分。如果您将输入9*4中的三个字符复制到数组中,那么您应该只希望将这三个字符视为字符串的一部分。你不想要的是数组中超过这三个字符的所有内容,最多MAXSIZE也被视为字符串的一部分。因此,您需要将字符串结束标记'\0'放在您关注的字符之后。

(BTW,inFix[MAXSIZE] = '\0';不仅将字符串结束标记放在数组的末尾,而且将放在数组之外,这是您不允许的。该程序将表现得不可预测。)

inFix[0] = '9';
inFix[1] = '*';
inFix[2] = '4';
inFix[3] = '\0'; // <-- this is where you need to put the end-of-string marker, because this is the end of the characters you care about.

将字符串结尾标记放在数组的末尾有效地做到了这一点:

inFix[0] = '9';
inFix[1] = '*';
inFix[2] = '4';

inFix[3] = ???
inFix[4] = ???
   .
   .
   .
inFix[98] = ???
inFix[99] = ??? // annoying bell noise? musical note symbol?

inFix[100] = '\0'; // Yes, Please!

将数组初始化为全零的原因(也可以像这个char inFix[MAXSIZE] = {};,空括号而不是0)为你工作的原因是因为这意味着无论你在哪里停止写你关心的角色,下一个角色将是'\0'。在你关心的角色之后,这个位置是唯一重要的地方。

由于复制字符的循环确切地知道它停止的位置,因此也确切地知道插入字符串结束标记的确切位置。只需在正确的位置插入一个'\0'即可。

答案 2 :(得分:0)

您使用以下代码声明了数组:

char inFix[MAXSIZE];

此时,数组的内容未初始化。打印出这些未初始化的字符将导致您看到的行为(奇怪的字符,声音等)。

但是,该数组的内容未初始化。如果要初始化此数组,请将此行更改为:

char inFix[MAXSIZE] = {0};

此初始化语法会导致数组中的元素被初始化。第一个元素初始化为括号中提供的值,而不在括号中的任何值将初始化为0.在上面的情况中,所有数组元素将初始化为0(恰好对应到NULL字符\0)。

由于在这种情况下所有字符都被初始化为NULL,因此您无需在输入后附加空字符。

那就是说,一个更好的解决方案是根本不使用C风格的数组,而是使用std::vector<char>,或简单地使用std::string,如上所述。

答案 3 :(得分:0)

你说你使用inFix[MAXSIZE] = '\0'终止字符串,因为你现在明白这应该转换为inFix[MAXSIZE - 1] = '\0',但在这种情况下你说你有一个字符串以最后可能的字符结束!!那么你应该如何添加一些东西(例如括号)?因为它已满,不能再接受任何字符了。

所以可能最好使用inFix[a] = '\0',因为你知道指向字符串的结尾,现在如果a < MAXSIZE那么你有足够的空间来为字符串添加更多的项目,否则你可能会增加MAXSIZE(例如使用strcat)或向用户显示一些错误。