试图从字符串中提取复数

时间:2017-12-06 17:14:13

标签: c strtok strchr

我试图从文本文件中提取两列数字。第一列是数字的实部,第二列是虚部的第二列。我设法从文件中提取数字列表作为字符串,但我不知道如何将字符串分成两部分。我试图使用sscanf函数,但只是没有工作。困难的部分是数字可以是正数和负数,因此我不能在strtok函数的分隔符中使用+和 - 因为它将删除负数。我被困了几天所以任何建议将不胜感激。提前致谢。这是我在sscanf行中发生错误的代码。

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

        char array[35]= "[[[1+1i -4+100i 45-234i -56-78i]]]";
        char *arrayp[35];
        int count,n,i,j;
        double complex z1;
        double real = 0;
        double imaginary = 0;

        int main()
        {
            arrayp[0] = strtok(array," []");
            n=1;
            while (arrayp[n-1]!=NULL)
            {
               arrayp[n] = strtok(NULL, " []");
               n++;
            }
        // up to this point it has been tested to work. the remaining code is very 
        // sloppy since I have tried 8 different things and have quickly written one of 
        // the options tried.    

            for(j=0;j<n;j++)
            {
                if (strchr(*arrayp, '+'))
                {
                    sscanf(arrayp[j],"%f+%fi", real, imaginary);
                }
                else if(arrayp string has equal to more than 1 '-')
                {
                     sscanf(arrayp[j],"%f%fi", real, imaginary);
                }
            }
        }
  

输出应该是这样的:
  0 0
  -4 100
  45 -234
  -56 -78

我注意到有一些错误,例如试图在strchr中搜索* arrayp但是它的指针我不知道如何将指针转换为字符串,所以我可以把它放到这个文件中。感谢您提前提供的帮助和努力。

2 个答案:

答案 0 :(得分:2)

到目前为止很好但是在

sscanf(arrayp[j],"%f%fi", real, imaginary);

有两个错误。首先,scanf函数系列需要%lf double目标。

其次,它需要目标的地址,所以

sscanf(arrayp[j], "%lf%lfi", &real, &imaginary);

另外,我不明白为什么你需要首先构建一个字符串指针数组 - 只需检查NULL生成的每个非strtok标记指针。

编辑:这是一个小测试程序。

#include <stdio.h>
#include <string.h>

int main ()
{
    double r, i;
    char array[]= "[[[1+1i -4+100i 45-234i -56-78i]]]";
    char *tok;
    tok = strtok(array, " []");
    while(tok) {
        sscanf(tok, "%lf%lfi", &r, &i);
        printf("%.0f %.0fi\n", r, i);
        tok = strtok(NULL, " []");
    }
    return 0;
}

节目输出:

1 1i
-4 100i
45 -234i
-56 -78i

程序应该更严格,并检查sscanf的返回值。

答案 1 :(得分:0)

自己解析每个数字。从索引1开始扫描字符串(因为索引0是+/-或数字),寻找a&#34; =&#34;或者&#34; - &#34;。一旦找到它,就会知道如何拆分字符串。