Как мне преобразовать строку в комплексное число в C? - PullRequest
1 голос
/ 04 октября 2019

Итак, в основном, я должен построить простой калькулятор комплексных чисел, используя C. Однако и ввод, и вывод должны быть в строковой форме. Имейте в виду, что complex.h не разрешен, поэтому необходима простая структура для действительной и мнимой частей.

Например, строка "-3.2 + 2.4i" должна была бы стать:

a.real = -3.2;

a.img = 2.4;

А затем вернуться к строковой форме после выполнения какого-либо вычисления, что, вероятно, намного проще, так как все выНужно сделать, это преобразовать его обратно с помощью gcvt () и объединить их обоих с помощью strcat ().

Я пытался использовать strtok для их разделения, но это была такая головная боль, и она не работала почти каждый раз. Было бы возможно, если бы обе части всегда были положительными, но знаки «+» и «-» делали все беспорядочным.

struct complex {
  double real, img;

};

int main() {
  struct complex a, b, c;

  //calculator itself would be here
}

struct convertNumber() {

  //conversion would happen here. Can I return both the real and imaginary parts at once with just this one fuction?
}

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Используйте strtod. Он будет анализировать действительную часть из строки и устанавливать указатель на первый символ после реальной части. Затем вы можете снова вызвать strtod с указателем, чтобы проанализировать мнимую часть.

Вот очень простой (немного небезопасный) пример:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    if (argc != 2) {
        return 1;
    }

    char* startptr = argv[1];
    char* endptr = NULL;
    double real = strtod(startptr, &endptr);
    if (startptr == endptr) {
        return 1;
    }

    startptr = endptr;
    endptr = NULL;
    double imag = strtod(startptr, &endptr);
    if (startptr == endptr) {
        return 1;
    }

    if (*endptr != 'i') {
        return 1;
    }

    printf("%f + %fi\n", real, imag);

    return 0;
}
0 голосов
/ 05 октября 2019

sscanf() дает другой подход:

// Return `complex` value.
// Store in *endptr location of end of conversion
struct complex convertNumber(const char *source, char **endptr) {
  struct complex destination;
  int n = 0;
  sscanf(source, "%f %f i %n", &destination.real, &destination.img, &n);
  if (endptr) {
    *endptr = (char*) &source[n];
  }
  return destination;
}

Пример использования:

char buffer[100];
if (fgets(buffer, sizeof buffer, stdin)) {
  char *endptr;
  struct complex y = convertNumber(buffer, &endptr);
  // If no conversion or junk at the end ...
  if (buffer == endptr || *endptr) {
    printf("Conversion failed '%s'\n", buffer);
  } else {
    printf("Conversion %e %+ei\n", y.real, y.img);
  }
}
0 голосов
/ 04 октября 2019

Вы использовали struct в функции неправильно, это не переопределяемый тип.

Определите его так:

typedef struct Complex {
  double real, img;
} Complex;

, тогда вы сможете определить этовот так:

Complex * convertNumber(double realpart, double imgpart) {
  Complex * newComplex = malloc(sizeof(Complex));
  newComplex->real = realpart;
  newComplex->img = imgpart;
  return newComplex;
}

Пожалуйста, убедитесь, что вы free эти переменные, когда вам больше не нужно их использовать, иначе это приведет к утечке памяти!

...