1

ポインタを使用して文字列変数を作成することは可能ですか?そのため、char x [4] = "aaa"のように、毎回そのサイズを渡す必要はありませんか?

そのような文字列のサイズを取得するにはどうすればよいですか?

そして、空の文字列をポインタで初期化できますか?

4

2 に答える 2

9

C の文字列は、ヌル ターミネータ文字で終わることに注意してください\0。したがって、ポインタ変数に整形式の文字列が格納されている場合は、次の文字を検索して長さを判断できます。

char *x = "hello"; // automatically appends a null terminator
int len = 0;
while (x[len] != '\0') {
    len++;
}

変数が初期化されていないか、整形式でない場合 (たとえば、 であるなどNULL)、明らかにこのアプローチをとることはできません。ただし、ほとんどの関数は通常、文字列が整形式であるという前提で記述されています。これは、コードの高速化につながるためです。

ポインタを初期化する場合はNULL、有効なアドレス (例: char *x = &someCharVar)、または文字列定数 (例: )の 3 つのオプションがありますchar *x = "hello"。文字列定数を使用する場合、非定数文字列のアドレスで再代入しない限り、そのポインターに書き込むことは違法であることに注意してください。

// Get enough space for 24 characters plus null terminator
char *myString = (char*) malloc(25 * sizeof(char));
strcpy(myString, "some text"); // fill the new memory
fgets(myString, 25, stdin); // fill with keyboard input

aは常に正確に 1 バイトとして定義されるsizeof(char)ため、ここでは不要であることに注意してください。charただし、他のデータ型を使用している場合に備えて、これを行うのは良い習慣であり、意図を非常に明確にすることで、コードを自己文書化するのに役立ちます。

于 2012-11-15T20:24:33.820 に答える
3

の配列をchar文字列リテラルで初期化する場合、サイズを指定する必要はありません。

char str[] = "This is a test";

これはstr15 要素の配列として作成されchar(サイズは 0 ターミネータを含む初期化子の長さから取得されます)、文字列リテラルの内容がそれにコピーされます。

文字列リテラルは、タイプ「N 要素配列」 ( C++ の場合)の配列式です。宣言で配列を初期化するために使用されている場合 (上記のように)、または単項演算子または単項演算子のオペランドである場合を除き、型 "array of " の式は型 "pointer to "の式に変換されます。式の値は、配列の最初の要素のアドレスになります。 charconst charsizeof&TT

あなたが書くなら

const char *str = "This is a test";

「これはテストです」という式は、「15 要素の配列」型charから「ポインタ」型に変換され、式charの値は最初の文字のアドレスになり、変数に書き込まれますstr

文字列リテラルの内容を変更しようとしたときの動作は未定義です。一部のプラットフォームは、文字列リテラルを読み取り専用メモリに格納しますが、格納しないプラットフォームもあります。同じ文字列リテラルの複数の出現を単一のインスタンスにマップするものもあれば、マップしないものもあります。文字列リテラルは常に変更不可として扱うのがstr最善const char *ですchar *

文字列の長さを取得するには、次を使用しstrlenます。

char str[] = "This is a test"; // or const char *str = "This is a test";
size_t len = strlen(str);      // or strlen("This is a test");

これは、文字列内の 0 ターミネータまで (ただし、0 ターミネータは含みません) の文字数を返します。strlen("This is a test")14 を返します。

文字列を含むバッファーのサイズを取得するには、次のsizeof演算子を使用します。

char str[] = "This is a test";
size_t len = sizeof str;       // or sizeof "This is a test"

次のようにポインターとして宣言した場合、これはバッファーのサイズを提供しないことに注意してください。str

const char *str = "This is a test";

その場合、それが指す文字列ではなく、 sizeof str;a のサイズのみを提供します。char *

于 2012-11-15T21:06:57.020 に答える