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];を使用して文字列全体 (null ターミネーターとすべて) を別の配列にコピーすることができます。 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])。それを変更しようとしない任意の関数 (例: 、 、 など) に引数として渡すことができprintfます。ただし、それに書き込むことはできないため、何らかの理由でコンテンツを変更する必要がある場合 (直接または や のような関数を介して) 、ローカル コピーを作成して操作する必要があります。 strtolstrchrstrtokstrcpy

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 **です。同様に、 の型はis , notです。ほとんどの場合、それは問題ではありません。配列であるかのようにポインターに添字演算子を使用できます(配列の添字はポインター演算の観点から定義されます) 。 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>2 つ未満の引数がある場合、または 2 番目の引数の長さが 2 未満の場合、それにアクセスすると未定義の動作が発生します。そのため、これらの場合に型があるかどうかは疑問です</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 に答える