Как установить предел цикла for для работы до конца строки / до достижения определенной строки - PullRequest
0 голосов
/ 26 апреля 2019

Итак, я в основном пытаюсь создать цикл 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). Допустимо ли писать условие вроде: </p>

for(i = 0; i<'\n'; i++) или i<=?

Я ожидаю, что он продолжит сканирование и сохранение данных, пока не достигнет знака равенства =.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2019

Попробуйте это:

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 голос
/ 26 апреля 2019

Поскольку вы читаете с scanf и спецификатором преобразования "%s" , вы будете использовать начальные пробелы перед каждым оператором, сохраненным в 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++). Вы не хотите увеличивать i в случае совпадения или ошибка ввода . Вы увеличиваете i только после проверки обоих преобразований успешно)

Пример использования / Вывод

$ ./bin/eqnread
5.1 + 6 - 2 + 25 * 4 =

equation:
 5.1 + 6 - 2 + 25 * 4 = res
0 голосов
/ 26 апреля 2019

Итак, я в основном пытаюсь создать цикл for, который сканирует входную строку .В качестве входных данных всегда используется одно число с плавающей запятой, а затем одна строка.

Если вам небезразлично строк (которые заканчиваются \n -или \r вкл. некоторые операционные системы ), вы не можете использовать scanf в одиночку , потому что scanf имеет дело со всеми видами пробелов (включая пробел,табуляция, новая строка, символы в форме перевода) таким же образом, поэтому игнорирует специфику символов конца строки (\n и / или \r).

Так что хороший способ - прочитайте всю строку сначала с fgets (или getline (3) в Linux), а затем анализ этой строки.Будьте осторожны с очень длинными строками, они могут произойти.

Как бы вы проанализировали, что строка чтения - это другой вопрос: ручной lexing и синтаксический анализ, или sscanf, или strtok или strtod и т. Д. ... приходят на ум.

И вы не определили, что для вас строка.Как насчет пространства внутри него?Как насчет строк ввода, которые длиннее, чем вы ожидаете (например, строка из тысячи символов)?%s для scanf остановится на первом месте.

Не забудьте внимательно прочитать документацию по каждой используемой функции.Изучите Как отлаживать небольшие программы .

Имейте в виду, что, фактически, в 2019 году UTF-8 используется везде, и это может усложнить вашу схему (и какие строки используются на практике).

Программа должна работать как базовый калькулятор

Кажетсячто вам следует заботиться о приоритетах операторов .Затем на ум приходит рекурсивный спуск .

...