因此,在我的CS课程中,我们必须制造一个计算器,该计算器读取输入,然后在读取=符号后计算结果。 输入总是由一个数字后跟运算符组成。
我现在正在努力扫描输入的方式。我想使用一些总是像这样存储的循环:
scanf("%lf %s ", &in, c);
注:计算器会先执行一项操作。因此,在下面的示例中,加号仅适用于20和4,然后结果将采用除号并除以8。然后,新结果将被'neg'字符串取反。
例如:输入:20 + 4/8 neg = 输出:结果:-3
这就是我尝试解决的方法。我的意图是使循环将每个数字存储到数组的新“框”中,然后将每个字符串存储到char数组的新“行”中。 op数组中的4用于设置字符串的最大长度,因为我知道可以出现的最长字符串是“ sqrt”。 我看到for条件下的'\ n'可能没用,但无法弄清楚该怎么做...
我正在考虑使用for或while循环。
int main(){
double in[10];
char op[5][4];
for(int i=0; i<5;i++){
scanf("%lf %s ", &in[i], op[i][4]);
}
printf("%.3f %s", in[0], op[0][0]);
return 0;
}
//只是代码的“骨架”。还有更多,但是在这里,我只提交了我正在努力的部分。
例如,如果我运行此代码,我想在输入中写一些数字,后跟运算符。 我希望它能打印出第一个数字和字符串(只是检查循环是否起作用)。
但是实际上,它绝对没有任何作用,只是给了我一些大的负数作为回报。
答案 0 :(得分:1)
在scanf的手册页中
int scanf(const char *format, ...);
如您所见,第一个参数是const char *
类型,即您需要提供有效的地址。
有了这个
char op[5][4]; /* 5 char array, in each char array you can have 4 char's
* i.e op[row][0] to op[row][3]. There is no op[i][4]
*/
你可以拥有
for(int i=0; i<5;i++){
scanf("%s",op[i]); /* op[i] itself address, so don't need & */
}
或
for(int i=0; i<5;i++){
for(int j=0; j<4; j++) {
scanf(" %c", &op[i][j]); /* storing char by char */
}
}
另外,在此处打印时,请使用%c
,因为op[0][0]
是char
类型。
printf("%.3f %c", in[0], op[0][0]);
答案 1 :(得分:0)
在scanf
格式的字符串中,%s
表示您要读取一个字符串,这意味着它需要将该字符串放在何处的地址。您正在为此传递op[i][4]
,即char
。