我想要一个只由数字和算术运算符组成的字符串。然后用代数解决它们。例如用户输入为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);
}
答案 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];
是没用的......错了