Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当使用C+从中缀符号更改为后缀符号时,输出显示非通用字符+;_C_Pointers_C Strings_Postfix Notation_Infix Notation - Fatal编程技术网

当使用C+从中缀符号更改为后缀符号时,输出显示非通用字符+;

当使用C+从中缀符号更改为后缀符号时,输出显示非通用字符+;,c,pointers,c-strings,postfix-notation,infix-notation,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+^* #包括 #包括 内部主(空) { 无符号短t; int len,top=-1,i; char str[400],newStr[400],stack[400]; char*p_newStr=newStr; scanf(“%hu”、&t

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

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

Output:
abc*+
ab+zx+*
at+bac++cd+^*
#包括
#包括
内部主(空)
{
无符号短t;
int len,top=-1,i;
char str[400],newStr[400],stack[400];
char*p_newStr=newStr;
scanf(“%hu”、&t);
而(t--)
{

如果(scanf(“%s”,str)=97&&str[i]问题是您处理
p\u newStr
时没有对其进行初始化,只对其执行指针算术。我想,您希望将其视为字符串,向其添加字符

因此,首先初始化它:

#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;
}
然后请注意,
p_newStr=p_newStr+str[i]
表示将转换为int的char str[i]的值添加到指针p_newStr。这是指针算法。将此语句替换为:

    char* p_newStr = newStr; // It was unitinitalised, pointing at random location
还有一个从堆栈中提取字符[]:

    *p_newStr++ = str[i];   // instead of p_newStr = ... 
最后,在printf()之前,为您构建的c字符串添加一个结尾为null的终止符:

一旦进行了这些更正,代码将精确地生成预期的结果

    *p_newStr++ = 0;
应该是:

p_newStr = p_newStr + str[i];

按照您目前的方式,您从未真正修改过新字符串。您在两个地方犯了这个错误。

什么是不常见的字符?它不是因为没有初始化变量,就是因为试图打印非ascii数字的ascii字符串,strxxx(),printf(),而成为垃圾“C++标签真的有道理吗?”@ JGR208,我的意思是,打印字符不是我的终端字符集所识别的。如果是在ASCII中,我的终端应该被识别。不在ASCII范围之外,我忘记ASCII的范围,所以说你想打印出700作为ASCII字母,这将是什么,这与它无关。任何角色,但嘿,好吧,我会尝试打印垃圾,因为它不知道如何处理it@Christophe代码是使用C++风格注释的。必须是:pSeNeSTR是用<代码> char Netrr(400)< /C> >创建的。我可以只使用“代码> NetrSr</CUT>作为字符串的指针,而不是<代码> pEnEntrr < /Cord>?不,因为<代码> Netrr[]
是一个数组。写入
newstr
只是将其转换为指针。如果您不熟悉指针,可以使用newstr[j],其中j是一个从0开始的索引,在添加新字符后递增。
newstr
p_newstr
之间有什么区别。自newstr[]是数组,newStr应该指向newStr[0]的地址。与p_newStr不一样吗?我的解决方案还有一个问题。我需要处理多个字符串,例如输入是
3(a+(b*c))((a+b)*(z+x))((a+t)*((b+(a+c))^(c+d)))
。在这种情况下,我的代码的逻辑仍然有效,但我需要能够重新初始化字符数组,以便它们可以存储新字符串,而不是在已添加的空字符或0字符后追加新字符。我如何做到这一点?p_newStr只是一个可以指向任何地方的指针。其名称的简单性是不够的nt:如果你想重新初始化,只需重新分配
p_newStr=newStr
:你添加的新字符将覆盖旧字符。如果旧字符串更长,结尾0将剪切字符串。谢谢!我明白了。这意味着我们存储
newStr[0]的地址
p_newStr
中,并根据需要对其进行增量。我们不能对
newStr
进行增量,因为它就像一个指向
newStr[0]
的常量。这也解释了重新初始化的工作原理。
p_newStr = p_newStr + str[i];
*p_newStr++ = str[i];