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

时间:2010-11-01 01:43:05

标签: 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中变量的类型?

4 个答案:

答案 0 :(得分:3)

首先,它已经是一个以NULL结尾的字符数组。您可以通过说char *c = argv[1];来选择创建指向它的另一个指针,或者您可以使用strcpy(char *destination, char *source)函数http://www.cplusplus.com/reference/clibrary/cstring/strcpy/将整个字符串(null-terminator和all)复制到另一个数组中这样:

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

两种方法都有效。

答案 1 :(得分:3)

您可以将argv[1] 视为它是char的数组(即,您可以将其下标为argv[1][i])。您可以将其作为参数传递给任何不尝试修改它的函数(例如printfstrtolstrchr等。但是,您不能,因此如果您因任何原因(直接或通过strtokstrcpy等函数)需要修改内容,您将会必须创建一个本地副本并操纵它。

如果您使用的是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;
}

请记住以下几点:

  1. argv类型char **不是 char *[N];同样,argv[i]的类型为char *,而非char [M]。在大多数情况下,这无关紧要;你可以在指针上使用下标运算符,好像它是一个数组(数组下标是定义的指针算术),但请记住指针和数组是不一样的,并不总是可以互换的;

  2. argv[argc]始终为NULL;

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

  4. C没有字符串数据类型;字符串表示char的0终止序列。字符串文字(例如"hello")以在程序生命周期内存在的方式存储,您可以通过指针值访问它们;尝试修改它们会导致未定义的行为(即,不要这样做)。

答案 2 :(得分:1)

argv[1][2]类型为char,总是(&lt; pedantry&gt;访问它会导致未定义的行为,如果少于两个参数或第二个参数的长度小于2 - 所以它在这些情况下是否有类型&lt; / pedantry&gt;)是有疑问的。但是,字符本身可能代表一个数字,要检查该字符,请使用标题isdigit()中的<ctypes.h>

#include <ctypes.h>
...
if (argc > 1) {
  int digits = 0;
  for (int i = 0, len = strlen(argv[1]); i < len; ++i)
    if (isdigit(argv[1][i]))
      digits++;
  printf("Digits in %s: %d\n", argv[1], digits);
}

答案 3 :(得分:0)

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

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