0

我的 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

4 回答 4

3

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

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

任何一种方法都是有效的。

于 2010-11-01T01:48:50.783 回答
3

您可以将argv[1] 其视为一个数组char(即,您可以将其下标为argv[1][i])。您可以将它作为参数传递给任何不尝试修改它的函数(例如,printfstrtolstrchr等)。但是,您不能写入它,因此如果您出于任何原因需要修改内容(直接或通过类似strtokor的函数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;
}

只要记住几件事:

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

  2. argv[argc]总是NULL; _

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

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

于 2010-11-01T02:32:19.583 回答
1

argv[1][2]始终是类型char(<pedantry>如果参数少于两个或第二个参数的长度小于两个,则访问它会导致未定义的行为 - 因此在这些情况下它是否具有类型值得怀疑</pedantry>) . 但是,字符本身可能代表一个数字,并且要检查它,请使用isdigit()from header<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);
}
于 2010-11-01T01:58:31.683 回答
0

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

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

于 2010-11-01T01:48:15.400 回答