我在本学期用C编写微处理课程。我们的第一个小分配是计算从i = 0到函数的用户定义值N的总和(1 /(1 + i ^ 2))。我想在命令行中使用其中一个参数变量作为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();
}
此代码保存为microp.c,我在终端中使用gcc编译代码。我的终端命令如下:
$ gcc microp.c -o microp -lm
$ ./microp 3
我使用参数3作为值N(我求和的上限)。我的程序运行时没有编译错误,但没有给出正确的结果。当我在代码中给N一个值时,代码给出了正确的答案。我怀疑它是因为我使用argv的方式。有什么建议吗?
答案 0 :(得分:1)
首先,我会替换&#39;而#39;使用&#39; for&#39;,以便使代码更具可读性:
#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();
}
第二,我会删除第二个printf语句,或者至少添加一个换行符,我真的不知道argv [-1]应该是什么,因为它看起来超出范围
printf("%f \n ",sum);
//printf("%c \n ",argv[-1]);
argc 代表参数计数,它基本上是一个正整数,表示 argv 的大小,代表参数值
所以,你的argv []域名将从0开始 - > (的argc-1) 请记住,仅仅执行程序本身就算作一个参数,argv [0] ...... 所以调用 ./ microp 3 会产生一个带有此内容的argv数组:
["./microp", "3"]
我刚才意识到的是 argv 只接受字符串作为成员,所以当你通过&#34; 3&#34;作为参数,您的程序实际上采用其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
...
如果您有其他问题,请告诉我,祝你好运=)