如何将数组输入到Mac终端上的C程序?

时间:2017-03-12 21:24:38

标签: c macos

我在OSX 10.11上用C编写一对函数来计算极坐标形式的相量之和的大小和角度,我遇到了一些麻烦。我有两个主要问题:

1)如何将两个数组作为输入(我要求的相量的大小和角度)给终端中的函数?

2)如果C强制使用main,argc和argv,我怎么能这样做呢?

以下是代码:

float PhasMag(float *coef,float *angle);
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv)
{
    if(argc != 2){
        printf("Incorrect number of arguments, please input an array of magnitudes and an array of angles, exiting\n");
        return -1;
    }
    return PhasMag(argv[1],argv[2]);
}

float PhasMag(float *coef,float *angle)
{
    float R = 0,Im = 0, Mag; //real and imag. parts of answer
    float *countM;
    int sc = 0 ,sa;
    countM = coef;
    while(countM != NULL){
        countM = countM + 1;
        sc = sc + 1;
    }
    sa = sc;
    for(int i = 0;i<sc;i++){//computes real part
        coef = coef + i; angle = angle + i;
        R = R + (*coef)*cos(*angle);
    }
    coef = coef - sc + 1; angle = angle - sa + 1;
    for(int k = 0;k<sa;k++){//computes imaginary part
        coef = coef + k; angle = angle + k;
        Im = Im + (*coef)*sin(*angle);
    }
    return sqrt(R*R+Im*Im);
}

2 个答案:

答案 0 :(得分:1)

你从命令行参数(argv [i]中的东西)获得的是字符串(char *)。你必须自己在C中解析这些浮动。

如果你想让你的程序将两个数组作为两个独立的输入,你可以像这样指定

 ./yourprogram '1.0 2.0 3.0 4.0' '5.0 6.0 7.2 8.1'

请注意两个数字数组周围的引号,这对shell来说是很重要的,因为它们将这两个参数传递给程序,而不是8个单独的浮点数。

您必须手动解析每个字符串中的浮点数,拆分空格字符,并使用scanfatof之类的函数来解析浮点数字符串的一部分。

或者,您可以将命令行界面指定为

  ./yourprogram 5 a1 a2 a3 a4 a5 b1 b2 b3 b4 b5

然后在你的程序中运行argv中的10个浮点值。有很多方法可以做到这一点。我个人会以{&#34}的格式读取stdin的程序;第一行包含数组N的大小,下一行包含N个浮点值coeff&#39; s,下一行包含N角度的浮点值。然后,您可以更轻松地拥有其他程序来为此程序生成输入。

HTH,

答案 1 :(得分:0)

命令行参数作为指向&#34;字符串&#34;的指针数组传递,实际上为const char* argv[]。所以你得到的总是一个字符串数组,从来没有一个甚至两个别的数组,也不是浮点数。

我认为你有三个选择:

  1. coefangle之后围绕"'个参数,从而 将列表字符串分别打包成一个字符串
  2. 不要将coefs和angle作为参数传递,而是将它们存储在a中 文件并将文件名作为参数或
  3. 传递
  4. 将(单个)参数列表分为两组,coefs和 角度,并将它们解析为花车。
  5. 我在这里只提出选项3;如果您更喜欢其他的,请不要犹豫要求提示或只是搜索网页;

    选项3依赖于偶数量的参数,前半部分表示coefs,后半部分表示角度。请按以下方式调用:

    myprg 1.0 2.0 43.0 180.0
    --> 0: 1.000000/43.000000   1: 2.000000/180.000000
    myprg
    --> Error: please pass float values (an even amount) as parameters
    myprg 1.0 2.0 43.0
    --> Error: please pass float values (an even amount) as parameters
    myprg 1.0 2.0 43.0 foo
    --> Error parsing parameters; foo is not a valid float value
    

    以下是代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    float PhasMag(float *coef,float *angle, int n) {
    
        // your actual code goes here...
        for (int i=0; i<n; i++) {
            printf("%d: %f/%f\n",i, coef[i], angle[i]);
        }
        return 0.0;
    }
    
    int scanParams(float* result, int amount, const char* params[]) {
        for (int i=0; i<amount; i++) {
            if (sscanf(params[i], "%f", result) != 1) {
                printf("Error parsing parameters; %s is not a valid float value", params[i]);
                return 0;
            }
            result++;
        }
        return 1;
    }
    
    
    int main(int argc, const char *argv[])
    {
    
        int nrOfArguments = argc -1;
        if (nrOfArguments %2 > 0 || nrOfArguments == 0) {
            printf("Error: please pass float values (an even amount) as parameters");
            return 1;
        }
    
        int sizeOfArray = nrOfArguments / 2;
        float coef[sizeOfArray];
        if (!scanParams(coef,sizeOfArray, argv+1))
            return 1;
    
        float angle[sizeOfArray];
        if (!scanParams(angle,sizeOfArray, argv+1+sizeOfArray))
            return 1;
    
        PhasMag(coef,angle,sizeOfArray);
    
        return 0;
    }