如何在C中将字符串转换为复数?
所以,基本上,我必须用C语言构建一个简单的复数计算器。然而,输入和输出都必须是字符串形式。记住complex.h是不允许的,这就是为什么需要一个用于实部和虚部的简单结构 例如,字符串“-3.2+2.4i”必须变为: a、 实际值=-3.2 a、 img=2.4 然后在某种计算完成后返回字符串形式,这可能更容易,因为您需要做的只是使用gcvt()将其转换回字符串形式,并将它们与strcat()合并 我曾尝试使用strtok分割它们,但这是一个非常头痛的问题,几乎每次都失败了。如果两个部分都是正的,那么这是可能的,但是“+”和“-”符号把一切都搞得一团糟如何在C中将字符串转换为复数?,c,string,complex-numbers,C,String,Complex Numbers,所以,基本上,我必须用C语言构建一个简单的复数计算器。然而,输入和输出都必须是字符串形式。记住complex.h是不允许的,这就是为什么需要一个用于实部和虚部的简单结构 例如,字符串“-3.2+2.4i”必须变为: a、 实际值=-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;
}
动态内存映射也有一个变体,尽管有人建议上面的方法可以按预期工作。使用
strod
。它将从字符串中解析实部,并设置指向实部后面第一个字符的指针。然后,您可以使用该指针再次调用strtod来解析虚部
下面是一个非常简单(稍微不安全)的示例:
#包括
#包括
int main(int argc,字符**argv){
如果(argc!=2){
返回1;
}
char*startptr=argv[1];
char*endptr=NULL;
双实数=strtod(开始和结束);
如果(startptr==endptr){
返回1;
}
startptr=endptr;
endptr=NULL;
双imag=strtod(startptr和endptr);
如果(startptr==endptr){
返回1;
}
如果(*endptr!=“i”){
返回1;
}
printf(“%f+%fi\n”,实数,imag);
返回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);
}
}
@AlekDavis这个问题是针对C#,一种完全不同的语言,不需要
malloc
。为什么人们总是坚持把结构放在堆上?如果我们在函数内部定义一个结构,它在函数外部将不再有效,因此我们不能安全地返回它。@Lukasz032struct
s通过值传递和返回。如果坚持用指针传递,最好创建另一个函数参数,让调用方提供一个预先分配的缓冲区。可以使用Complex convertNumber(double realpart,double imgpart){return(Complex){realpart,imgpart};}
建议%f%+fi\n
为了避免像“2.4+-3.2i”这样一行中有两个符号的输出,学究式的“%f%f%*1[Ii]%n”
将更接近strtod()
,但我也喜欢使用尾随空格。
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);
}
}