1

我正在为学校做作业,我似乎对数组中的其他字符有疑问。(在其他问题中......)

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

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 循环来打印下一个函数开头的中缀数组中的内容,只是为了看看......

我听到了这种烦人的哔哔声,还有一串奇怪的字符,比如心形、音乐符号……还有……一整串奇怪的字符。可能是什么问题呢?谢谢。

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

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

4

4 回答 4

2

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

于 2012-10-02T21:24:13.270 回答
2

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

我听到了这种烦人的哔哔声,还有一串奇怪的字符,比如心形、音乐符号……还有……一整串奇怪的字符。可能是什么问题呢?

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

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

inFix[MAXSIZE] = '\0';

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

(顺便说一句,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] = {};,空括号而不是 a 0)对您有用的原因是因为这意味着无论您在哪里停止编写您关心的字符,下一个字符都将是 a '\0'。那个位置,就在你关心的角色之后,是唯一重要的地方。

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

于 2012-10-02T23:02:26.463 回答
0

您声明了数组:

char inFix[MAXSIZE];

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

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

char inFix[MAXSIZE] = {0};

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

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

也就是说,更好的解决方案是根本不使用 C 样式数组,而是使用 a std::vector<char>,或者简单地使用 a std::string,如上所述。

于 2012-10-02T21:28:37.713 回答
0

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

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

于 2012-10-02T22:08:56.290 回答