问题:: C中字符串操作的算术表达式

时间:2011-06-01 17:58:27

标签: 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.
#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;
}

4 个答案:

答案 0 :(得分:0)

嗯,是的,代码中存在一些问题。我们通常不会在这里运行免费的调试服务,但对于初学者来说,这是:

(s,i,0);

应该做什么?

答案 1 :(得分:0)

copy函数中,ending null character的内容之后的s被复制到t?使用\n而不是\0终止c字符串是错误的。所有c字符串都以末尾的空字符结束。

答案 2 :(得分:0)

您是否尝试在调试器中单步执行此代码?我认为这样做可以更清楚地表明你的程序没有按照你的想法去做。

一个潜在的问题是if(task==2) { ... } else { ... }函数中fix块之后的代码永远不会被执行。 ifelse个案都包含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;
}