C程序将字符串转换为整数并以代数方式求解它们

时间:2017-01-14 11:45:30

标签: c string math integer

我想要一个只由数字和算术运算符组成的字符串。然后用代数解决它们。例如用户输入为string =“45 - 98 + 656”,输出为“603”整数。 这是我的代码

#include <string.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>

int main(void){

    scanf(%s, &S);
    int sum = 0;
    int a;
    for (int i = 0; i < strlen(S); i++) {
        if (S[i] == ' ') {
            continue;
        } else
        if (S[i] != ' ') {
            if (isdigit(S[i])) {
                a = atoi(&S[i]);
            } else
            if (!isdigit(S[i])) {
                if (S[i] == '+') {                    
                    S[i] = S[i + 1];
                    sum = (sum + a);
                } else
                if (S[i] == '-') {        
                    S[i] = S[i + 1];
                    sum = (sum - a); 
                } else {
                    sum = a;
                }
            }
        }                                                                            
    } 
    printf("%d", sum);
}

3 个答案:

答案 0 :(得分:2)

您的代码存在语法错误。

  • 您忘记了"
  • 周围的%s
  • 您没有声明S

这是一个更简单的解决方案:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char buf[200];

    if (fgets(buf, sizeof buf, stdin)) {
        long sum = 0;

        /* remove all white space */
        for (int i = j = 0, len = strlen(buf); i <= len; i++) {
            if (!isspace((unsigned char)buf[i]))
                buf[j++] = buf[i];
        }
        /* parse the expression */
        for (char *p = buf, *q;;) {
            long a = strtol(p, &q, 10);
            if (p == q) {
                break;
            } else {
                sum += a;
                p = q;
            }
        }
        printf("sum = %ld\n", sum);
    }
    return 0;
}

答案 1 :(得分:1)

这个(不寻常的)解决方案应该可以解决问题。它严格按照从左到右的方式工作:

sum= 0
number= 0
op= '+'
while get(character)
  case character of
    digit: case op of
             '+': sum-= number; number= 10 * number + character; sum+= number
             '-': sum+= number; number= 10 * number + character; sum-= number
    '+', '-': number= 0; op= character

现在有点混淆但非常有效的C翻译:

char* c= "45 - 98 + 656";
int s= 0, n= 0, d, p= 1;
for ( ; d= *c - '0', *c; c++)
    if ((unsigned)d <= 9) { s-= n; n= 10 * n + p * d; s+= n; }
    else if (*c != ' ') { n= 0; p= *c == '+' ? 1 : -1; }
printf("s = %d\n", s);

应该打印出603

答案 2 :(得分:0)

查看此代码我看到一些错误,在atoi()后你必须根据数字大小递增索引(例如“656”是3个字符长)。
即使在此修复之后,此算法也是错误的,因为您过早地执行操作。 我的意思是,在你的例子中,这个算法计算-45 + 98并且不计算656 此外S[i]=S[i+1];是没用的......错了