Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中将字符串转换为复数?_C_String_Complex Numbers - Fatal编程技术网

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

如何在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分割它们,但这是一个非常头痛的问题,几乎每次都失败了。如果两个部分都是正的,

所以,基本上,我必须用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
。为什么人们总是坚持把结构放在堆上?如果我们在函数内部定义一个结构,它在函数外部将不再有效,因此我们不能安全地返回它。@Lukasz032
struct
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);
  }
}