Для извлечения a из строки ai+b
даже с пробелом между значением a и 'i' просто используйте sscanf и проверьте его возвращает 1, чтобы убедиться, что вы прочитали int
И, наконец, также извлечь оператор и b просто сделать
sscanf(argv[1], "%d i %c %d", &a, &oper, &b)
и проверьте, что он возвращает еще 3 oper действительно, например:
#include <stdio.h>
int main(int argc, char ** argv)
{
int a, b;
char oper;
if (argc != 2)
printf("Usage: %s <ai+b>\n", *argv);
else if ((sscanf(argv[1], "%d i %c %d", &a, &oper, &b) == 3)
&& ((oper == '+') || (oper == '-')))
printf("a=%d b=%d oper=%c\n", a, b, oper);
else
puts("invalid input");
return 0;
}
Компиляция и исполнения:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out ai+2
invalid input
pi@raspberrypi:/tmp $ ./a.out 12i+3
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i - 3"
a=12 b=3 oper=-
pi@raspberrypi:/tmp $ ./a.out "12i+-3"
a=12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i+-3"
a=-12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i*-3"
invalid input
pi@raspberrypi:/tmp $
Примечание. Я разрешаю вводить 1i-2
напрямую, а не заставлять вводить 1i+-2
менее практично, поскольку я позволяю оператору указывать '-', если вы не хотите разрешить эту упрощенную форму:
#include <stdio.h>
int main(int argc, char ** argv)
{
int a, b;
if (argc != 2)
printf("Usage: %s <ai+b>\n", *argv);
else if (sscanf(argv[1], "%d i + %d", &a, &b) == 2)
printf("a=%d b=%d\n", a, b);
else
puts("invalid input");
return 0;
}
Компиляция и исполнения:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out ai+2
invalid input
pi@raspberrypi:/tmp $ ./a.out 12i+3
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i - 3"
invalid input
pi@raspberrypi:/tmp $ ./a.out "12i+-3"
a=12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i+-3"
a=-12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i*-3"
invalid input
pi@raspberrypi:/tmp $ ./a.out "-12i++3"
a=-12 b=3 oper=+
pi@raspberrypi:/tmp $
О вашем обновлении, ваши входные строки для sscanf недействительны, потому что вы даете NULL-указатели, вы хотите что-то вроде этого:
#include <stdio.h>
int main()
{
char line[64];
int a;
int b;
int c;
int d;
int finala;
int finalb;
printf("Enter the first complex number in the form ai + b: ");
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d i + %d", &a, &b) != 2)) {
puts("invalid form");
return -1;
}
printf("Enter the second complex number in the form ai + b: ");
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d i + %d", &c, &d) != 2)) {
puts("invalid form");
return -1;
}
finala = b*c + a*d;
finalb = b*d + a*c*(-1);
printf("(%di + %d) * (%di + %d) = %di + %d\n", a, b, c, d, finala, finalb);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
Enter the first complex number in the form ai + b: 1i+2
Enter the second complex number in the form ai + b: -2i+6
(1i + 2) * (-2i + 6) = 2i + 14
pi@raspberrypi:/tmp $