Функция strtok() с разделителем-пробелом

Я пытаюсь реализовать калькулятор RPN с помощью C. Ниже приведен код:

    float rpn(void) {
    float ans = 0;
    int top = -1;
    float stack[50];
    char expression[100];
    char *token;
    float newnumber;
    float operand1, operand2;
    int i;
    printf("Enter RPN statement here: \n");
    scanf("%s", expression);

    /* get the first token */
    token = strtok(expression, " ");

    /* walk through other tokens */
    while (token != NULL) {
        if (isdigit(*token)) {
            newnumber = atof(token);
            push(stack, &top, newnumber);
        } else {
            if (top < 1) {
                printf("Error: Not enough operands to perform the operation!\n");
                return ans;
            } else {
                operand1 = pop(stack, &top);
                operand2 = pop(stack, &top);
                newnumber = evaluate(token, operand1, operand2);
                push(stack, &top, newnumber);
                ans = newnumber;
            }
        }
        token = strtok(NULL, " ");

        printf("\nCurrent stack is: \n");
        for (i = 0; i <= top; i++) {
            printf("%f\n", stack[i]);
        }
        printf("\n");
    }
    return ans;
}


    float pop(float* stack, int* top) {
    float ans;
    ans = stack[*top];
    (*top)--;
    return ans;
}

int push(float* stack, int* top, float n) {
    (*top)++;
    stack[*top] = n;
    return 0;
}

float evaluate(char* operator, float x, float y) {
    float ans;
    if (strcmp(operator, "+") == 0) {
        ans = x + y;
    }
    if (strcmp(operator, "-") == 0) {
        ans = x - y;
    }
    if (strcmp(operator, "*") == 0) {
        ans = x * y;
    }
    if (strcmp(operator, "/") == 0) {
        ans = x / y;
    }
    return ans;
}

Проблема в том, что при использовании запятой или точки в качестве разделителей в функции strtok() она работает, но с пробелом считывается только до первого токена.

Любая помощь?

Спасибо


person user3126802    schedule 19.04.2014    source источник
comment
Пожалуйста, не удаляйте вопрос после ответа на него. Это нарушает весь смысл существования StackOverflow.   -  person Jongware    schedule 29.04.2014


Ответы (1)


В первый пробел читается не strtok, а scanf:

scanf("%s", expression);

Как только scanf увидит пробел, TAB или любой другой разделитель, он перестанет читать и вернет слово до пробела. Вот почему это работает, когда вы используете непустой разделитель.

Замените на fgets, чтобы решить проблему:

fgets(expression, 100, stdin);
person Sergey Kalinichenko    schedule 19.04.2014
comment
моя вина! Спасибо! Однако это приводит к новой проблеме: при вычислении последнего выражения на вершину стека помещается большое число. - person user3126802; 19.04.2014
comment
это связано с тем, что вы не вводите пробел после последнего введенного числа. Спасибо! - person user3126802; 19.04.2014
comment
@user3126802 user3126802 Возможно, вам придется следить за завершающим \n, который является частью строки с fgets (это не часть строки с scanf). - person Sergey Kalinichenko; 19.04.2014
comment
да, это была проблема. добавил \n в качестве разделителя, и он работает! Спасибо за вашу помощь! - person user3126802; 19.04.2014