如何设置for循环的限制,直到到达行尾/直到特定的字符串为止

时间:2019-04-26 05:51:56

标签: c c99

所以我基本上是在尝试扫描输入行的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<=

我希望它继续扫描并存储数据,直到达到等号=

3 个答案:

答案 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和解析,或sscanfstrtokstrtod等...头脑。

您没有定义适合您的字符串。那里面的空间呢?如果输入行长于您的预期(例如,一千个字符的行)呢? %s的{​​{1}}将在第一个空格处停止。

别忘了仔细阅读 每个使用函数的文档。学习How to debug small programs

还要注意,实际上,在2019年,UTF-8used everywhere,这可能会给您的方案(以及实际使用的字符串)带来麻烦。

  

该程序应作为基本的计算器

然后您似乎应该关心operator precedence。然后,recursive descent parsing浮现在脑海。