C中的命令行参数计数

C中的命令行参数计数,c,command-line-arguments,C,Command Line Arguments,我用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]; } }

我用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);
 }
#包括
void main(int argc,char*argv[])
{
int i=0;
对于(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。任何理由。提前感谢

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

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

如果要检查命令行参数,可以执行以下操作

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

对于(i=0;i请记住,C数组是基于零的,因此有效索引运行[0..argc]。您的程序将跳过检查
argv[0]

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

如果要检查命令行参数,可以执行以下操作

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

对于(i=0;i这是因为
argv
不包含命令行参数。它包含完整的命令行。第一个是命令,其余是参数。

这是因为
argv
不包含命令行参数。它包含完整的命令行。第一个是命令,其余是参数。

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

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

实际上,argv[0]保存程序名,并在程序派生子程序时使用它。
无论何时在C中调用fork(),它都会生成一个与父进程同名的子进程,例如a.out。child从argv[0]中获取其父进程的名称。因此,每件事都有一个正确的用途。

实际上,argv[0]持有程序的名称,并在程序派生子进程时使用它。
无论何时在C中调用fork(),它都会生成与父进程同名的子进程,例如a.out.child从argv[0]获取其父进程的名称。因此,每件事都有目的。我不知道你的情况,但我的第一个想法是看看args的值是什么。在这种情况下,在我使用的每一个平台上,这会让事情变得更清楚。顺便问一下,你的循环应该在这里做什么?这里没有任何相关内容。只是添加它以标记为参数的结尾不尝试吹毛求疵,但
main()
应该返回
int
。我不知道你的情况,但我的第一个想法是看看args的值是什么。在这种情况下,在我使用的每一个平台上,这会让事情变得更清楚。顺便问一句,你的循环应该在这里做什么?这里没有任何相关内容。只是添加它以标记为参数的结尾不尝试吹毛求疵,但
main()
应该返回
int
。程序名。这是文件名吗?@simonc:它没有定义为可执行文件名。它的实际值是特定于实现的。@Koneri考虑到cHao的评论,
argv[0]
被指定为程序名(C99 s5.1.2.2.1程序启动)。程序名很可能是可执行程序的文件名,但这不能保证。程序名。这会是文件名吗?@simonc:它没有定义为可执行程序的文件名。它的实际值是特定于实现的。@Koneri考虑到cHao的评论,
argv[0]
被指定为程序名(C99 s5.1.2.2.1程序启动)。程序名很可能是可执行程序的文件名,但这不能保证。注意:不是“正在执行的文件”,而是“程序名”。在某些平台或某些情况下,两者可能不相同。注意:不是“正在执行的文件”,但“程序名”。在某些平台或某些情况下,两者可能不相同。