使用argv在C中传递变量

使用argv在C中传递变量,c,while-loop,argv,C,While Loop,Argv,这学期我在为一门微处理器课程用C语言编写代码。我们的第一个小赋值是计算从i=0到函数(1/(1+i^2))的用户定义值N的总和。我想将命令行上的一个参数变量作为N的值传递,这样用户就可以从命令行执行我的程序(这是我的教授的要求)。这是我的密码: #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv) { int i = 0;

这学期我在为一门微处理器课程用C语言编写代码。我们的第一个小赋值是计算从i=0到函数(1/(1+i^2))的用户定义值N的总和。我想将命令行上的一个参数变量作为N的值传递,这样用户就可以从命令行执行我的程序(这是我的教授的要求)。这是我的密码:

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

int main(int argc, char *argv)
{
    int i = 0;
    float sum = 0;

    while (argv[1] >= i)
        { 
        sum += 1/(1+pow(i,2));
        i++;
        }
    printf("%f",sum);
    printf("%c",argv[-1]);
    getchar();
}

我使用参数3作为值N(总和的上限)。我的程序运行时没有编译错误,但没有给出正确的结果。当我在代码中简单地给N一个值时,代码给出了正确的答案。我怀疑这是因为我使用argv的方式。有什么建议吗?

首先,我将用“for”替换“while”,以使代码更具可读性:

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

int main(int argc, char *argv)
{
    int i = 0;
    float sum = 0;

    for (i=0;i<=argv[1];i++)
    { 
        sum += 1/(1+pow(i,2));
    }
    printf("%f",sum);
    printf("%c",argv[-1]); //this over here, what is it for?
    getchar();
}

这就是“argc”“argv”的工作原理。。。 argc表示参数计数,它基本上是一个正整数,表示参数值argv的大小

因此,您的argv[]域将从0->(argc-1) 请记住,仅仅执行程序本身就算作参数argv[0]。。。 因此,调用/microp3将生成包含以下内容的argv数组:

["./microp", "3"]
重要 我刚刚意识到,argv只接受字符串作为成员,因此当您将“3”作为参数传递时,您的程序实际上接受其ASCII值,所以请尝试在之前进行一些验证,或者直接强制转换它

 int main(int argc, char *argv)
{
    int i = 0;
    float sum = 0;
    argv[1]=atoi(argv[1]); //this is just an example of string to int conversion
...

如果您还有其他问题,请告诉我,祝您好运=)

argv[1]
-->
atoi(argv[1])
。另外,
argv[-1]
是UB。
argv
是字符串列表。您需要将这些字符串值转换为数值,然后才能像在上面的代码中一样使用它们。命令行参数不是这样工作的。首先尝试一个更简单的程序,直到您对它们感到满意。
char*argv
Zzzztttt。尝试
char*argv[]
如果您传递的数字超过一个数字,它将崩溃,因为ASCII值仅用于单个字符,这是您应该转换它的另一个原因
main
的原型是
int main(int argc,char*argv[])
。您可以编写
char**argv
。但是,
char*argv
不起作用。因此我使用@Mr.Robot建议转换类型,但atoi()似乎给我带来了一个错误:
警告:传递'atoi'的参数1会使指针从整数变为无强制转换[-Wint conversion]N=atoi(argv[1])^另外:
/usr/include/stdlib.h:147:12:注意:应为“const char*”,但参数的类型为“char”extern int atoi(const char*u nptr)
我试图查找char和const之间的差异,但我仍然不明白为什么类型转换不起作用!我得到了它。使用机器人先生的建议,然后最终注意到@John3136所指出的内容。错误是因为在main的参数中仅放置*argv而不是*argv[]。真的。
["./microp", "3"]
 int main(int argc, char *argv)
{
    int i = 0;
    float sum = 0;
    argv[1]=atoi(argv[1]); //this is just an example of string to int conversion
...