如何在 C 中将字符串转换为复数?

How do I convert a string to a complex number in C?

所以,基本上,我必须使用 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?
}

你在函数中用错了 struct,它不是可重定义的类型。

定义如下:

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

然后你就可以这样定义这个函数了:

Complex convertNumber(double realpart, double imgpart) {
  Complex newComplex;
  newComplex.real = realpart;
  newComplex.img = imgpart;
  return newComplex;
}

还有一个带有动态内存映射的变体,尽管有人建议上面的方法可以按预期工作。

使用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;
}

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 %*1[Ii] %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);
  }
}