c: Как использовать sscanf для чтения аргумента командной строки (x, y) и сохранения x и y как отдельных двойников внутри структуры?

#c #command-line-arguments #argv

#c #аргументы командной строки #argv

Вопрос:

Я работаю над калькулятором комплексных чисел. Пользователь должен передать сложные операнды в качестве аргументов основной функции с помощью командной строки. Кроме того, числа должны передаваться точно в этой записи (x,y) , где x — действительная часть числа, а y — мнимая часть.

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

На данный момент я сосредоточен на том, чтобы иметь возможность сохранять хотя бы одно комплексное число из аргумента командной строки. Я надеюсь, что кто-нибудь здесь сможет направить меня в правильном направлении. Вот часть моего кода, которая касается чтения из argv и сохранения в моей комплексной переменной struct struct complex c

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct complex {
    double real;
    double imag;
};

int main(int argc, char *argv[]) {

    struct complex c;
    sscanf(argv, "(%lf,%lf)", amp;c.real, amp;c.imag);
    printf("%.2lf %.2lf n", c.real, c.imag);
    return 0;
}
 

Я пробовал использовать разные варианты параметров sscanf , но пока мне удалось сохранить только один из двойников (тот, который соответствует действительной части числа) и только тогда, когда пользователь не использует скобки. Как мне выполнить процедуру?

Комментарии:

1. sscanf(argv должно быть sscanf(argv[1] , и вы также должны проверить argc и проверить возвращаемое значение sscanf

2. также вам нужно будет подумать о среде оболочки, с помощью которой вы вызываете свою программу — оболочка может интерпретировать ( специально, поэтому вам может потребоваться указать аргумент при вызове таким образом

3. наконец, было бы неплохо вызвать complex что-то еще, чтобы избежать столкновения со стандартными комплексными числами C — если <complex.h> включено, то это имя будет определено как макрос, который нарушит вашу программу

4. К вашему сведению: C99 и выше уже поддерживают комплексные числа, см.: en.cppreference.com/w/c/numeric/complex

5. @MarcoBonelli спасибо, это задание, и я не могу использовать <complex.h>

Ответ №1:

Я думаю, что лучше прочитать параметр как целую строку (%s), а затем обработать его. но если вы настаиваете на использовании sscanf, вы можете попробовать использовать это.

но имейте в виду, что когда вы передаете параметр типа (1,2), команда like будет считать, что это один параметр, поэтому вам нужно передать что-то вроде (1, 2) — между запятой и 2 есть пробел. также не забудьте проверить, что у вас есть 3 параметра.

    struct complex 
   {
        double real;
        double imag;
   };
    
   int main(int argc, char *argv[]) 
   {
    
        struct complex c;
        if(3 == argc)
        {
            sscanf(argv[1], "(%lf,", amp;c.real);
            sscanf(argv[2], "%lf)",  amp;c.imag);
            printf("%.2lf %.2lf n", c.real, c.imag);
        }
        return 0;
    }