2013-05-27 121 views
1

我已经用C语言编写了这个程序,它使用命令行参数并将其与参数数量一起显示。但是参数比输入参数的数量多一个。命令行参数的计数为C

#include<stdio.h> 
void main(int argc, char *argv[]) 
{ 
int i=0; 
for(i=0;argv[1][i]!='\0';i++) 
{ 
    if(argv[1][i]>='a' && argv[1][i]>='z') 
    { 
    argv[1][i]=argv[1][i]; 
    } 
    } 
    printf("%s",argv[1]); 
    printf("\n"); 
    printf("%d",argc); 
} 

我通过的论点:上abracadabra。它给我一个数字3.任何理由。在此先感谢

+0

我对你不了解,但我的第一个想法是*看看参数值是什么*。在这种情况下,在我使用的每个平台上,这将清除一切。 – cHao

+0

btw你的循环应该在这里做什么? – gkovacs90

+0

这里没有关系。刚刚添加它以标记为参数的结尾 – Koneri

回答

1

有没有想过printf("%s",argv[0])会做什么? C数组索引从0开始。这就是你的问题的解决方案。argv [0]保存正在执行的程序名,并且是第一个参数(例如,a.out)

+0

注意:不是“正在执行的文件”,而是“程序名称”。这两者在某些平台或某些情况下可能不一样。 – cHao

4

请记住,C数组是从零开始的,因此有效索引运行[0..argc]。您的程序跳过检查argv[0]

除了指定的参数之外,argv[0]被设置为您的程序名(如果平台无法确定名称,则为NULL)。

如果你想检查命令行参数,你可以不喜欢

int i; 
for (i=0; i<argc; i++) { 
    printf("argv[%d] = %s\n", i, argv[i]); 
} 
+0

噢,好的。谢谢 – Koneri

+0

程序名称。那会是文件名吗? – Koneri

+1

@simonc:它没有被定义为可执行文件的文件名。它的实际价值是特定于实现的。 – cHao

0

这是因为argv不成立的命令行参数。它拥有完整的命令行。第一个是命令,其余的是参数。

1

其实argv [0]成立该程序的名称,并在程序分岔一个孩子时使用它。 无论何时在C中调用fork(),它都会生成一个与父进程具有相同名称的子进程,例如a.out。子从argv [0]获取其父项的名称。所以每件事都有一个目的。