我遇到的问题是,如果没有从命令行提供足够的参数,我希望程序改为请求所有值。出于某种原因,当我提供3个参数中的2个时,它会工作,但如果提供了1个或没有提供任何参数,它就会工作。
我的代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    float areaOfcircle(float radius_circle)
    {
        float area_circle;
        area_circle = M_PI * radius_circle * radius_circle;

        return area_circle;
    }
    void resitance_current(float length, float area_circle, float voltage, float* resistance, float* current)
    {
        float resistivity;
        resistivity = 1.782*pow(10, -8);
        *resistance = ((resistivity*length) / area_circle);
        *current = (voltage / *resistance);
    }

    void radius_check(float radius)
    {
        if (radius <= 0)
        {
            printf("Radius cant be less than or equal to 0");
            exit(1);
        }
    }
    void voltage_check(float voltage)
    {

        if (voltage <= 0)
        {
            printf("Voltage cant be less than or equal to 0");
            exit(1);
        }
    }
    void length_check(float length)
    {
        if (length <= 0)
        {
            printf("Length cant be less than or equal to 0");
            exit(1);
        }
    }

    void validation(float radius, float voltage, float length)
{
    radius_check(radius);
    voltage_check(voltage);
    length_check(length);
}
    int main(int argc, char *argv[])
    {
        float radius, voltage, length, current, resistance;
        float length_u, length_l;
        //dumpargs(argc, argv);
        radius = atof(argv[1]);
        voltage = atof(argv[2]);
        length = atof(argv[3]);
        if (argc != 4)
        {
            printf("Not enough arguments supplied\n");
            printf("Enter the radius of wire : ");
            scanf("%f", &radius);
            radius_check(radius);
            printf("Enter the Voltage of circuit : ");
            scanf("%f", &voltage);
            voltage_check(voltage);
            printf("Enter the Length of Wire : ");
            scanf("%f", &length);
            length_check(length);
        }
        validation(radius, voltage, length);
        resitance_current(length, areaOfcircle(radius), voltage, &resistance, &current);
        printf("Resistance = %f , Current = %f\n", resistance, current);
        printf("\nEnter the Upper Length of Wire : ");
        scanf("%f", &length_u);
        printf("\nEnter the Lower Length of Wire : ");
        scanf("%f", &length_l);
        if ((length_l < 0) || (length_l >= length_u))
        {
            printf("\nImpossible for Lower Length < 0 or to be larger then Length Upper");
            exit(1);
        }
        else
        {
            for(length_l = length_l; length_l<=length_u; length_l++)
            {

                resitance_current(length, areaOfcircle(radius), voltage, &resistance, &current);
                printf("\nLength = %0.3f Resistance = %0.3f , Current = %0.3f", length, resistance, current);
                length = (length_l + 1);

            }
        }
        return 0;
    }

从代码“if(argc!=4)“然后,如果这些值是通过命令行提供的,则会再次请求并重写它们。我试图找到解决这个问题的办法,所以如果程序本身是从CMD运行的,那么将请求这些值,但如果提供了所有的值,代码将继续工作。除argc以外,代码按要求运行。
谢谢你的帮助

最佳答案

如果传递的参数小于4,则访问越界。
修改代码如下。
即首先检查传递的参数数,然后访问argv

    if (argc != 4) // or if (argc < 4)
    {
        printf("Not enough arguments supplied\n");
        printf("Enter the radius of wire : ");
        scanf("%f", &radius);
        printf("Enter the Voltage of circuit : ");
        scanf("%f", &voltage);
        printf("Enter the Length of Wire : ");
        scanf("%f", &length);
    }
    else {

        radius = atof(argv[1]);
        voltage = atof(argv[2]);
        length = atof(argv[3]);
    }
    radius_check(radius);
    voltage_check(voltage);
    length_check(length);

您还需要检查scanfRead this on how to check scanf return value的返回值。

关于c - 在代码中引用时argc位置问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54186483/

10-12 00:38
查看更多