如何在 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);
}
}
所以,基本上,我必须使用 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);
}
}