在C语言中,如何将字符串转换为字符数组?

在C语言中,如何将字符串转换为字符数组?,c,string,argv,C,String,Argv,我在我的C程序中有一个传递的参数argv[1],我想把这个字符串转换成一个字符数组。我该怎么做 int main(int argc, char* argv[]) { char c [] = argv[1]; // This is what I want to do... } 编辑: 我试图做的是从argv[1]中获取某些字符,并检查它们是否是数字。因此,理想情况下,我会这样做: int a = argv[1][2] 但是这又遇到了另一个问题——如何检查C中变量的类型?从技术上讲,a

我在我的C程序中有一个传递的参数
argv[1]
,我想把这个字符串转换成一个字符数组。我该怎么做

int main(int argc, char* argv[])
{
    char c [] = argv[1]; // This is what I want to do...
}
编辑:

我试图做的是从
argv[1]
中获取某些字符,并检查它们是否是数字。因此,理想情况下,我会这样做:

int a = argv[1][2] 

但是这又遇到了另一个问题——如何检查C中变量的类型?

从技术上讲,argv[1]已经是一个字符数组了。在标准C中真的没有“字符串”这样的东西


你想用它做什么?你只想要一份吗?在这种情况下,您需要为一个新的字符数组分配一些空间,然后使用“strcpy”将argv[1]复制到您的字符数组中。

首先,它已经是一个以NULL结尾的字符数组。您可以简单地选择创建另一个指向它的指针,方法是说
char*c=argv[1]
,或者您可以使用以下
strcpy(char*destination,char*source)
函数将整个字符串(null终止符和all)复制到另一个数组中:

char c[BUFFER]; //This has to be big enough to hold length + 1
strcpy(c, argv[1]);

这两种方法都是有效的。

argv[1][2]
的类型始终是
char
(如果参数少于两个,或者如果第二个参数的长度小于两个,则访问它会导致未定义的行为,因此在这些情况下,它是否具有类型值得怀疑)。但是,字符本身可能表示一个数字,要检查这一点,请使用标题中的
isdigit()

#包括
...
如果(argc>1){
整数位数=0;
对于(int i=0,len=strlen(argv[1]);i
您可以将
argv[1]
视为一个
char
数组(即,您可以将其下标为
argv[1][i]
)。您可以将其作为参数传递给任何不尝试修改它的函数(例如,
printf
strtol
strchr
,等等)。但是,您无法对其进行写入,因此如果出于任何原因(直接或通过类似于
strtok
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;
}
#包括
#包括
int main(int argc,字符**argv)
{
char*c=NULL;
如果(argc>=2)
{
c=malloc(strlen(argv[1])+1);
strcpy(c,argv[1]);
}
/**
*用c做东西
*/
免费(c);
返回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;
}
#包括
int main(int argc,字符**argv)
{
如果(argc<2)
返回0;
尺寸长度=strlen(argv[1]);
字符c[len+1];
strcpy(c,argv[1]);
/**
*用c做东西
*/
返回0;
}
记住几件事:

  • argv
    的类型是
    char**
    ,而不是
    char*[N]
    ;类似地,
    argv[i]
    的类型是
    char*
    ,而不是
    char[M]
    。在大多数情况下,这并不重要;您可以在指针上使用下标运算符,就像它是一个数组一样(数组下标是根据指针算术定义的),但请记住,指针和数组不是一回事,并且不总是可互换的

  • argv[argc]
    的值始终为
    NULL

  • 除非它是
    sizeof
    或一元
    &
    运算符的操作数,或者是在声明中用作初始值设定项的字符串文字,否则数组类型的表达式将从“T的N元素数组”转换为“指向T的指针”,表达式的值是第一个元素的位置

  • C本身没有字符串数据类型;字符串表示为以0结尾的
    char
    序列。字符串文本(如
    “hello”
    )的存储方式使其在程序的整个生命周期内都存在,您可以通过指针值访问它们;试图修改它们会导致未定义的行为(即,不要这样做)


  • 你在这里的目标是什么?您已经可以使用与数组(
    argv[1][0]
    argv[1][1]
    ,…)相同的方式访问
    argv[1]
    ,…)。技巧问题!C字符串是以null结尾的字符数组。@mootinator:字符指针和字符数组(类型)不完全相同。@Jefromi:如何?C不会对数组值进行边界检查。@Christian Mann:例如,请参阅。一个是包含地址的变量,另一个不是。它还不是字符数组。它是指向包含字符的连续内存块的指针。虽然它们在许多方面表现相同,但有(细微的)区别
    argv[1]
    是字符指针,而不是字符数组。在许多情况下,它们的行为可能相同,但也存在差异。正确的表述方式是,
    argv[1]
    指向字符数组的第一个字符。在C中没有真正的“类型”——您只需要访问它。手表:
    charc;int i;c=‘A’;i=c//我现在65岁了。Sheesh,我可以以整数形式访问指针值,它会让我。记住,它只是二进制的。@Christian:你的评论不是迂腐的,而是不正确的。对象在C中确实有类型,除了标准中定义的一些特定情况外,通过不同类型的指针访问对象是未定义的行为。顺便说一句,您的注释与作为不同类型的访问无关,只涉及从int到char再到char到int的隐式转换,这是值转换,而不是二进制数据的重新解释。
    
    #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;
    }