所以我基本上是在尝试扫描输入行的for循环。输入始终是一个双浮点数,然后是一个字符串。它将继续扫描,直到到达字符串=
。每个数字值存储到double数组,每个字符串存储到char数组。
问题是输入线可以任意长,我不知道该怎么做
该程序应作为基本计算器工作,该计算器读取一个双精度浮点数,然后读取一个运算符为字符串,然后执行操作。如果后面有另一个数字,请使用该数字执行操作。如果达到等号=
,程序将输出结果。
int main() {
double res;
double in[10];
char *op[10][5];
int arrCheck[10];
for(int i=0; i<=5; i++) {
scanf("%lf %s ", &in[i], op[i]);
arrCheck[i] = opCheck(op[i]);
}
return 0;
}
到目前为止,这是我程序的主要部分。我设法使其正常工作并正确存储数据。尽管它始终仅在预定义的限制上起作用(例如,i <= 5)。编写类似这样的条件是否合法:
for(i = 0; i<'\n'; i++)
还是i<=
?
我希望它继续扫描并存储数据,直到达到等号=
。
答案 0 :(得分:3)
尝试一下:
for(int i = 0; (i <= 5) && (strcmp(op[i], "=") != 0); i++) {
...
}
关于您的问题,将整数与字符串进行比较是不合法的。这就是为什么存在字符串比较功能的原因。
您也可以像这样从for
循环中退出:
int main()
{
double res;
double in[10];
char op[10][5];
int arrCheck[10];
for(int i=0;i<=5;i++){
scanf("%lf %s ", &in[i], op[i]);
if (strcmp(op[i], "=") == 0)
break;
arrCheck[i] = opCheck(op[i]);
}
return 0;
}
哪个解决方案比以前发布的解决方案更好。
答案 1 :(得分:1)
由于您正在使用scanf
和"%s"
conversion-specifier 进行读取,因此在存储在op[n]
中的每个运算符之前,您将消耗前导空格。无需调用strcmp
,您只需通过取消引用指针即可检查第一个字符,例如
if (scanf ("%lf %s", &in[i], op[i]) != 2 || *op[i] == '=')
break;
省略问题中未包含的opCheck(op[i])
的简短示例,您可以执行以下操作:
#include <stdio.h>
int main (void) {
double in[10];
char op[10][5];
int i = 0, n;
while (i < 10) {
if (scanf ("%lf %s", &in[i], op[i]) != 2 || *op[i] == '=')
break;
i++;
}
n = ++i;
puts ("\nequation: ");
for (i = 0; i < n; i++)
printf (" %g %s", in[i], op[i]);
puts (" res");
}
(注意:使用while (i < 10)
而不是for (i = 0; i < 10; i++)
。如果 matching <,您不想增加i
< / em>或 input 失败。只有在两次转换都成功通过验证之后,您才能递增i
)
使用/输出示例
$ ./bin/eqnread
5.1 + 6 - 2 + 25 * 4 =
equation:
5.1 + 6 - 2 + 25 * 4 = res
答案 2 :(得分:0)
所以我基本上是想做一个for循环来扫描输入 line 。输入始终是一个双浮点数,然后是一个字符串。
如果您特别关心行(以\n
-或以<{> 1 operating systems的\r
结尾),您不能单独使用scanf ,因为scanf
以相同的方式处理所有类型的空格字符(包括空格,制表符,换行符,换页符),因此忽略行尾字符(\n
和/或\r
)的特殊性。
因此,好的方法是先使用fgets(或在Linux上为getline(3)),然后再parse读取该行。小心行很长,它们可能会发生。
您如何解析该读取行是一个不同的问题:手动lexing和解析,或sscanf
或strtok或strtod等...头脑。
您没有定义适合您的字符串。那里面的空间呢?如果输入行长于您的预期(例如,一千个字符的行)呢? %s
的{{1}}将在第一个空格处停止。
别忘了仔细阅读 每个使用函数的文档。学习How to debug small programs。
还要注意,实际上,在2019年,UTF-8是used everywhere,这可能会给您的方案(以及实际使用的字符串)带来麻烦。
该程序应作为基本的计算器
然后您似乎应该关心operator precedence。然后,recursive descent parsing浮现在脑海。