目标:这里的代码应该是 读任意长算术 表达式,如233 + 200。然后呢 应该在后缀和前缀中打印 格式并计算它,即433。
Problems: output shows anomalous data like 98, 101 etc. I think there might be any mistake in the code. please have a look and let me know it.
#include<stdio.h>
void copy(char* t, char* s, int n)
{
int i;
for(i=0;i<n;i++)
t[i]=s[i];
t[n]='\n';
}
int fix(char* s, int length, int task)
{
int i;
for( i=length-1;i>=0;i--)
{
if((s[i]=='+')||(s[i]=='-'))
{
char s1[i+1];
char s2[length-i];
copy(s1,s,i);
copy(s2,s+i+1,length-i-1);
if(task==2)
{
return fix(s1,i,task)+fix(s2,i,task);
}
else
{
return fix(s1,i,task)-fix(s2,length-1,task);
}
if(task==0)printf("%c",s[i]);;
fix(s1,i,task);
fix(s2,length-i-1,task);
if(task==1)printf("%c",s[i]);
return 0;
}
}
}
int main(){
char s[80];
int i;
for(i=0;(s[i]=getchar())!='\n';i++);
fix(s,i,0);
printf("\n");
fix(s,i,1);
printf("\n");
printf("%d\n",fix(s,i,2));
return 0;
}
答案 0 :(得分:0)
嗯,是的,代码中存在一些问题。我们通常不会在这里运行免费的调试服务,但对于初学者来说,这是:
(s,i,0);
应该做什么?
答案 1 :(得分:0)
在copy
函数中,ending null character
的内容之后的s
被复制到t
?使用\n
而不是\0
终止c字符串是错误的。所有c字符串都以末尾的空字符结束。
答案 2 :(得分:0)
您是否尝试在调试器中单步执行此代码?我认为这样做可以更清楚地表明你的程序没有按照你的想法去做。
一个潜在的问题是if(task==2) { ... } else { ... }
函数中fix
块之后的代码永远不会被执行。 if
和else
个案都包含return
个参数,因此执行将永远不会进入该代码。
此外,for(i=0;(s[i]=getchar())!='\n';i++);
中的循环main
无法防止写入数组s
的末尾。这行代码与标准库函数gets
基本相同,它具有相同的问题。
您使用的是什么编译器?您使用了哪些编译器选项?
答案 3 :(得分:0)
我不确定任务0和任务1的目的是什么,但你根本没有在输入中使用+或 - 运算符。你应该做的是这样的事情:
#include<stdio.h>
int fix(char* s) {
int v=0;
for(int i=0;s[i]!='\0';i++) {
char op=s[i];
switch (op) {
case '+':
case '-':
// We encountered a math operator.
s[i]='\0';
if (op=='+') return fix(s) + fix(s+i+1);
else if (op=='-') return fix(s) - fix(s+i+1);
break;
case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case '0':
// This is part of the value.
v*=10;
v+=s[i]-'0';
break;
default:
// Ignore non-operators and non values.
break;
}
}
// Return the value
return v;
}
int main(){
char s[80];
int i;
for(i=0;(s[i]=getchar())!='\n';i++);
s[i]='\0';
printf("%d\n",fix(s));
return 0;
}