您可以将argv[1]
其视为一个数组char
(即,您可以将其下标为argv[1][i]
)。您可以将它作为参数传递给任何不尝试修改它的函数(例如,printf
、strtol
、strchr
等)。但是,您不能写入它,因此如果您出于任何原因需要修改内容(直接或通过类似strtok
or的函数strcpy
),您必须创建一个本地副本并对其进行操作。
如果您使用的是 C89 或更早版本,请使用此方法:
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char *c = NULL;
if (argc >= 2)
{
c = malloc(strlen(argv[1]) + 1);
strcpy(c, argv[1]);
}
/**
* Do stuff with c
*/
free(c);
return 0;
}
如果您使用的是 C99,则可以使用 VLA:
#include <string.h>
int main(int argc, char **argv)
{
if (argc < 2)
return 0;
size_t len = strlen(argv[1]);
char c[len+1];
strcpy(c, argv[1]);
/**
* do stuff with c
*/
return 0;
}
只要记住几件事:
的类型是,不是;argv
_ 同样,类型是,不是。在大多数情况下,这无关紧要。您可以在指针上使用下标运算符,就好像它是一个数组一样(数组下标是根据指针算术定义的),但请记住,指针和数组不是一回事,而且并不总是可以互换的;char **
char *[N]
argv[i]
char *
char [M]
的值argv[argc]
总是NULL
; _
除非它是sizeof
或一元运算符的操作数或&
在声明中用作初始化器的字符串文字,否则数组类型的表达式会从“T 的 N 元素数组”转换(“衰减”)为“指向T",表达式的值是第一个元素的位置;
C 本身没有字符串数据类型;字符串表示为以 0 结尾的序列char
。诸如字符串字面量"hello"
的存储方式使得它们在程序的整个生命周期中都存在,您可以通过指针值访问它们;试图修改它们会导致未定义的行为(即不要那样做)。