#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
и проверить возвращаемое значение sscanf2. также вам нужно будет подумать о среде оболочки, с помощью которой вы вызываете свою программу — оболочка может интерпретировать
(
специально, поэтому вам может потребоваться указать аргумент при вызове таким образом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;
}