Можно ли сделать какой-нибудь цикл, который сканирует всегда одно число и одну строку более одного раза?(Часть моей домашней работы) - PullRequest
0 голосов
/ 24 апреля 2019

так что в моем курсе CS мы должны сделать калькулятор, который читает входные данные, а затем вычисляет результат после того, как знак = был прочитан. Ввод всегда состоит из одного числа, за которым следует оператор.

Я сейчас борюсь со способом сканирования ввода. Я хочу использовать некоторый цикл, который всегда будет хранить его как:

scanf("%lf %s ", &in, c);

Примечание: калькулятор выполняет одну операцию за другой. Таким образом, в приведенном ниже примере знак плюс работает только для 20 и 4, и только тогда результат принимает знак деления и делится на 8. Затем новый результат отменяется строкой 'neg'.

Например: вход: 20 + 4/8 отриц. = Выход: Результат: -3

Вот как я пытался это решить. Моим намерением было заставить цикл хранить каждое число в новом «ящике» массива, а затем сохранять каждую строку в новой «строке» массива char. Массив 4 in op предназначен для установки максимальной длины строки, потому что я знаю, что самая длинная строка, которая может встречаться, это "sqrt". Я вижу, что '\ n' в условии for, вероятно, бесполезно, но не может понять, как это сделать ...

Я подумываю об использовании цикла 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;
}

// просто «скелет» кода. Это еще не все, но здесь я представил только ту часть, с которой я борюсь.

Например, если я запускаю этот код, я хочу записать несколько цифр, а затем оператор в поле ввода. Я ожидаю, что он напечатает первое число и строку (просто чтобы проверить, работает ли цикл).

Но на самом деле он абсолютно ничего не делает и просто возвращает мне большое отрицательное число в качестве возврата.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Со страницы руководства 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]);
0 голосов
/ 24 апреля 2019

В строке формата scanf, %s означает, что вы хотите прочитать строку, а это означает, что ему нужен адрес, куда поместить эту строку. Вы передаете op[i][4] для него, который является char.

...