当使用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];