の配列である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;
}
いくつかのことを覚えておいてください:
の型はargv
ではなくchar **
です。同様に、 の型はis , notです。ほとんどの場合、それは問題ではありません。配列であるかのようにポインターに添字演算子を使用できます(配列の添字はポインター演算の観点から定義されます) 。 char *[N]
argv[i]
char *
char [M]
の値はargv[argc]
常にNULL
です。
sizeof
または 単項演算子のオペランドであるか&
、宣言で初期化子として使用される文字列リテラルである場合を除き、配列型の式は「T の N 要素配列」から「へのポインタ」に変換 (「減衰」) されます。 T" であり、式の値は最初の要素の位置です。
C 自体には文字列データ型はありません。文字列はの 0 で終わるシーケンスとして表さchar
れます。のような文字列リテラル"hello"
は、プログラムの存続期間にわたって存在するような方法で格納され、ポインター値を介してアクセスできます。それらを変更しようとすると、未定義の動作が発生します (つまり、変更しないでください)。