В C, как я могу преобразовать строку в массив символов? - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть переданный аргумент argv[1] в моей C-программе, и я хочу преобразовать эту строку в массив символов.Как мне это сделать?

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 ]

3 голосов
/ 01 ноября 2010

Вы можете трактовать 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;
}

Если вы используете 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 не имеет строкового типа данных как такового; строки представлены в виде 0-концевых последовательностей char. Строковые литералы, такие как "hello", хранятся таким образом, что они существуют на протяжении всей жизни программы, и вы можете получить к ним доступ через значение указателя; Попытка изменить их приводит к неопределенному поведению (то есть не делать этого).

3 голосов
/ 01 ноября 2010

Прежде всего, это уже массив символов, заканчивающийся на NULL.Вы можете просто сделать еще один указатель на него, сказав char *c = argv[1];, или вы можете скопировать всю строку (нулевой терминатор и все) в другой массив, используя функцию strcpy(char *destination, char *source) http://www.cplusplus.com/reference/clibrary/cstring/strcpy/ следующим образом:

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

Любой подход действителен.

1 голос
/ 01 ноября 2010

argv[1][2] имеет тип char, всегда ( доступ к нему вызывает неопределенное поведение, если существует менее двух аргументов или если длина второго аргумента меньше двух - поэтому сомнительно, имеет ли введите в этих случаях ). Однако сам символ может представлять число, и для проверки используйте 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);
}
0 голосов
/ 01 ноября 2010

Технически, argv [1] уже является массивом символов. В стандарте C. действительно нет такой вещи, как «строка».

Что ты хочешь с этим делать? Вы просто хотите получить копию? В этом случае вам понадобится выделить немного места для нового массива символов, а затем использовать "strcpy" для копирования из argv [1] в ваш массив символов.

...