问题::C中字符串运算的算术表达式
目标:此处代码应为 阅读任意长算术 表达式为,233+200。然后它 应该打印后缀和前缀 格式化并计算它,即433问题::C中字符串运算的算术表达式,c,math,expression,C,Math,Expression,目标:此处代码应为 阅读任意长算术 表达式为,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. 嗯,是的,代码中有一些问题。我们通常不会在这里运行免费调试服务,但对于初学者来说,什么是: (s
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.
嗯,是的,代码中有一些问题。我们通常不会在这里运行免费调试服务,但对于初学者来说,什么是:
(s,i,0);
应该在做什么?在复制函数中,s的内容复制到t后的结尾空字符在哪里?用\n而不是\0终止c字符串是错误的。所有c字符串的结尾都以空字符终止。您是否尝试过在调试器中单步执行此代码?我认为这样做会更清楚地表明,您的程序没有做您认为它正在做的事情 一个潜在的问题是fix函数中iftask==2{…}else{…}块后面的代码永远不会执行。if和else案例都包含返回语句,因此执行将永远不会到达该代码 同样,你的循环fori=0;s[i]=getchar!='\n′;i++;在main中,没有防止写入超过数组s结尾的保护。这行代码本质上与标准库函数相同,后者也有相同的问题
你在用什么编译器?您正在使用哪些编译器选项?我不确定任务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;
}
很抱歉这是修正,i,0..只是记事本复制错误。@Gorge:复制粘贴代码,而不是手动复制。如果你在问题框中重新键入,你可能会键入你潜意识中知道是对的,而不是那里有什么。我们已经看到很多代码不可能得到错误的输出。对不起,我不明白你的意思??这是家庭作业吗?你能给我们提供一些你所看到的确切输出和你用来生成它的确切输入的例子吗?
#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;
}