1 Востаннє редагувалося koala (13.01.2021 12:35:24)

Тема: функція strtol()

Не розумію функцію strtol(). Що роблять рядки int num1 = strtol(str, &operation, 10);  int num2 = strtol(operation + 1 + (*(operation + 1) == ' ' ? 1 : 0), NULL, 10);   ????
Ось приклад програми:

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM_LENGTH 10

int main() 
{
    char str[2 * MAX_NUM_LENGTH + 2]; 
    system("chcp 1251");
    puts("Введіть числовий вираз у форматі: число1<оператор>число2");
    gets_s(str);
    char *operation;
    int num1 = strtol(str, &operation, 10);
    if (*operation == ' ') {
        operation++;
    }
    int num2 = strtol(operation + 1 + (*(operation + 1) == ' ' ? 1 : 0), NULL, 10);
    int result;
    switch (*operation) {
    case '+':
        result = num1 + num2;
        break;
    case '-':
        result = num1 - num2;
        break;
    case '*':
        result = num1 * num2;
        break;
    case '/':
        result = num1 / num2;
        break;
    }
    printf("Результат: %d\n", result);
    return 0;
}

2

Re: функція strtol()

За допомогою неї ти конвертуєш рядок (набір символів) у число (довге ціле) http://www.cplusplus.com/reference/cstdlib/strtol/ Біль детально тут. Оскільки у твоїй програмі йдуть операції із двома змінними, то і викликається вона 2 рази (Щоб перетворити ряди в числа)...

Подякували: Mikel45, leofun012

3

Re: функція strtol()

А чому operation + 1 + (*(operation + 1) == ' ' ? 1 : 0 ??? Це тобто перевіряє чи є пробіли після знаку чи як??

4

Re: функція strtol()

ні пробіли Ви пропускаєте в:

    if (*operation == ' ')
    {
        operation++;
    }

я ж скинув Вам посилання... А взагалі третім параметром strtol є посилання на місце у рядку де починається число.

Ось прототип long int strtol (const char* str, char** endptr, int base); у Вашому випадку endptr - це те місце.

5

Re: функція strtol()

ні пробіли Ви пропускаєте в:

Я все одно не розумію цей рядок operation + 1 + (*(operation + 1) == ' ' ? 1 : 0. Що саме він перевіряє? Чому == ' ' ? 1 : 0?

6

Re: функція strtol()

*(x+1) - це те саме, що x[1]. Тому

operation + 1 + (*(operation + 1) == ' ' ? 1 : 0)

це те саме, що

operation + 1 + (operation[1] == ' ' ? 1 : 0)

Перепишу з тимчасовою змінною:

char * temp;
if(operation[1] == ' ')
  temp = operation + 2;
else
  temp = operation + 1;
int num2 = strtol(temp, NULL, 10);

Так ясно?

Подякували: Mikel45, bebyk2

7

Re: функція strtol()

Так ясно?

Так, дякую

8

Re: функція strtol()

... А взагалі третім параметром strtol є посилання на місце у рядку де починається число.

Ось прототип long int strtol (const char* str, char** endptr, int base); у Вашому випадку endptr - це те місце.

Хотів поправитись. А взагалі третім параметром strtol є посилання на місце у рядку де ЗАКІНЧУЄТЬСЯ число.
І так наступний код

operation + 1 + (*(operation + 1) == ' ' ? 1 : 0)

видаляє пробіли, тільки вже після символу оператора та запам'ятовує символ оператора. Прошу пробачити ))) Надіюсь це роз'яснення Вас влаштує...

Подякували: Mikel451

9

Re: функція strtol()

Взагалі там мала бути умова, і вам варто було б її прочитати - і скопіювати сюди, якщо вже питаєте, що робить код. 90%, що відповідь буде в умові, можливо, не дуже добре розписана, але буде.

10

Re: функція strtol()

І ще - додавайте теги code (кнопка <>) наступного разу самостійно.