argv命令行参数容器的true属性

时间:2015-02-08 05:52:24

标签: c arrays pointers

我知道命令行参数由argv []数组中的字符串指针指向。即argv [0]包含指向程序名称的指针,argv [1]指向第一个命令行参数的指针。

但是我注意到argv在互联网上的应用非常不同,如下所示。我已成功编译它并打印出第二个参数第三个字符。

#include <stdio.h>  
    int main(int argc , char *argv []) {        
        printf("%c\n", argv [1][2]);                
        return 0; } 

我有两个问题来自这个用途。

argv的真正维度是什么?是停在两点还是更多?

我注意到程序员使用%c来访问和打印指向的内容的代码。现在,我们总是可以将一个指针(一个字符串指针)解析为%s,并期望它打印出一组字符,直到null终止符。

根据我的理解,%c只能在自身包含字符的数组中使用。

即。

char yadhavan [] = yadhavan is a boy;
 printf ("%c", yadhavan [3]);

有人可以解释%c是如何与指针数组一起使用的吗?

更多的解释总是非常受欢迎!

3 个答案:

答案 0 :(得分:3)

argv的类型为char*[],并且包含多个字符串(命令行参数) argv[i]的类型为char*,并且包含一个字符串。
argv[i][j]的类型为char并且包含一个字符。

  

argv的真正维度是什么?它会停在两个还是更多?

这取决于有多少命令行参数。

  

有人可以解释%c如何与指针数组一起使用吗?

可以声明char指针并使它们指向字符串或只使用char数组并保留字符串:

char* str="string";

或者

char str[]="string";

通过以下两种方式,可以使用以下方式引用角色:

printf("%c",str[3]);

argv实际上是char*的数组。因此,可以从中引用单个字符。

答案 1 :(得分:2)

  

argv的真正维度是什么?它停在两点还是还有更多?

argc会告诉您参数计数(或argv的维度)。换句话说,argv中的字符串数等于argc。因此,如果提供了多个参数,argv可以包含两个以上的字符串。例如,如果我要执行一些命令,如

$ foo file1 file2 ...

argv看起来像

argv[0] = "foo\0"
argv[1] = "file1\0"
argv[2] = "file2\0"
...

有关argc vs argv的详细信息,请参阅this other answer

  

有人可以解释%c是如何与指针数组一起使用的吗?

首先,%s用于打印字符串。 %c用于打印单个字符。其次,argv是一个字符串数组,字符串只是一个字符数组(char)。所以,argv实际上是一个字符数组的数组。所以,当你看到

printf("%c\n", argv[1][2]);

代码打印出argv中第二个参数的第三个字符。所以,如果我要执行命令

$ foo bar

argcargv看起来像

argc = 2
argv[0] = "foo\0"
argv[1] = "bar\0"
argv[1][0] = 'b'
argv[1][1] = 'a'
argv[1][2] = 'r'
argv[1][3] = '\0' // null terminator

答案 2 :(得分:0)

char * argv []是一个指针数组,它充当二维数组,它不能包含多于2D的数组。因此'argv'中的数据与2D非常相似,但未指定限制。您可以查看以下链接:Limit on the number of arguments to main in C

#include <stdio.h>  
   int main(int argc , char *argv []) {        
    printf("%c\n", argv [1][2]);                
    return 0; } 

这里char * argv []与

非常相似
Char argv[][]  //with no argument limitation.