c - 使用 C++ 从中缀表示法更改为后缀表示法时,输出显示不常见的字符

标签 c pointers c-strings postfix-notation infix-notation

Input:
3
(a+(b*c))
((a+b)*(z+x))
((a+t)*((b+(a+c))^(c+d)))

Output:
abc*+
ab+zx+*
at+bac++cd+^*

所有输入中都有括号,因此不需要检查运算符的优先顺序。 以下是我的解决方案:

#include <stdio.h>
#include <string.h>

int main (void)
{
  unsigned short t;
  int len ,top = -1, i;
  char str[400], newStr[400], stack[400];
  char* p_newStr = newStr;
  scanf("%hu", &t);
  while (t--)
  {
    if (scanf("%s", str) <= 400)
    {
      len = strlen(str);
      i = 0;
      while(i < len)
      {
        if (str[i] >= 97 && str[i] <= 122)
        {
          p_newStr = p_newStr + str[i];
        }
        else if (str[i] == '(' || str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '^')
        {
          top++;
          stack[top] = str[i];
        }
        else if (str[i] == ')')
        {
          while(stack[top] != '(')
          {
            p_newStr = p_newStr + stack[top];
            top--;
          }
          top--; //the '(' is discarded from the stack.
        }
        i++;
      }
      printf ("%s\n", newStr);
    }
  }
  return 0;
}

我在使用字符数组或库类处理 C 或 C++ 中的字符串方面没有太多经验。 当我运行它时,我得到无法识别的符号,而不是正确的后缀表示法。

最佳答案

问题是您处理 p_newStr 时没有对其进行初始化,而仅对其执行指针算术。我猜您想将其视为字符串,并向其添加字符。

所以首先初始化它:

    char* p_newStr = newStr; // It was unitinitalised, pointing at random location

然后请注意,p_newStr = p_newStr + str[i] 表示将 char str[i] 的值(转换为 int)添加到指针 p_newStr。这就是指针算术。将此语句替换为:

    *p_newStr++ = str[i];   // instead of p_newStr = ... 

还有另一个从堆栈[]中获取一个字符:

    *p_newStr++ = stack[top];   // instead of p_newStr = ... 

最后,在您构建的 c 字符串中添加一个空终止符,就在 printf() 之前:

    *p_newStr++ = 0;

完成这些更正后,代码将准确生成预期结果。

关于c - 使用 C++ 从中缀表示法更改为后缀表示法时,输出显示不常见的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083377/

相关文章:

c - 试图找到两个数组之间的最大差异

c - 如何将十六进制转换为阿拉伯字符串

c - 内联汇编 --> 错误 : internal_relocation (type: OFFSET_IMM) not fixed up

c++ - 当我在函数参数中使用指针时遇到错误

floating-point - atof 的奇怪行为

C - strtok 返回更少的数据

c - 如何访问使用双指针动态分配的结构的字符串成员

c - C 字符串中 '\0' 之后的内存会发生什么?

c++ - const char * 在循环期间改变值

c++ - constexpr log10 整数函数