2次元配列を使用して文字列配列を作成する方法は知っていますが、次のようなことができますか:
char array[];
array[1]="bob";
array[2]="cat";
はい、しかしあなたがやろうとしている方法ではありません。
たとえば、次のようにします。
char arr[] = "bob\0cat";
arr
"bob"
で始まるarr[0]
とで"cat"
始まる2 つの文字列が含まれていarr[4]
ます。文字列を見つけるために配列をトラバースする必要があるため、これは特に便利ではありませんが、メモリを効率的に使用します。
の各要素arr
は 1 つchar
の であるため、各要素に文字列を格納することはできませんが、複数の文字列を連続して格納することはできます。
文字列のリストを保存する方法は他にもあります。最も一般的なのは、char*
ポインターの配列を定義することです。各ポインターは、別の場所に割り当てられた文字列 (の最初の文字) を指します。のargv
パラメーターmain
は、このアプローチの最も一般的な例です。
あなたの例では:
char array[];
これは無効です。配列オブジェクトを定義する場合は、要素の数を指定する必要があります。
array[1]="bob";
array[2]="cat";
これらの割り当ては両方とも無効です。array[1]
でありarray[2]
、どちらも単一char
のオブジェクトです。単一の に文字列を割り当てることはできませんchar
。実際には、式"bob"
は暗黙的にchar*
ポインターに変換されますが、オブジェクトに代入することはまだできません。char
array
your をポインターの配列として定義した場合char*
、これらの割り当ては有効であり、実際には文字列のリストを表す通常の方法です。
char *array[2]; /* an array of pointers */
array[0] = "bob";
array[1] = "cat";
文字列自体は配列の外に割り当てられます。配列にはそれらへのポインタが含まれています。各ポインターは実際には 1 つのchar
オブジェクトを指していますが、そのポインターを使用して文字列全体にアクセスできます。
はい、できますが、ポインターの配列を使用する必要があります。
#include<stdio.h>
#include<conio.h>
int main()
{
char *ar[]={"one","two","three"};//array of pointer
for(int i=0;i<3;i++)
{
printf("%s\n",ar[i]);
}
}
文字列へのポインターの格納について話している場合は、はい:
const char *strings[SIZE];
strings[0] = "bob";
strings[1] = "cat";
...
文字列リテラルと配列のアドレスのみを格納していることに注意してください。文字列リテラルの内容は別の場所に保存されます。 "bob"
"cat"
strings
strings
const char *
文字列リテラルの内容を変更しようとすると未定義の動作が発生するため、は の配列として宣言されています。
複数の文字列の内容を 1 つの 1 次元配列に格納する場合は、次のようにそれらを連結する必要があります。
char dest[SIZE] = {0}; // want to make sure at least the first element is 0
strcat( dest, "bob" );
strcat( dest, "cat" );
その後dest
に、string が含まれます"bobcat"
。ここ"bob"
で、インデックス 0 から開始し、インデックス 3 から開始します。演算子を使用して文字列の内容を割り当てることはできない"cat"
ことに注意してください。のようなライブラリ関数を使用するか、各文字を個別に割り当てる必要があります。=
strcat
dest[0] = 'b';
dest[1] = 'o';
dest[2] = 'b';
...
個々の文字列がその 1-D シーケンス内でどこで開始および終了するかを追跡したい場合は、次のような何らかの区切り記号を追加する必要があります。
strcat( dest, "bob" );
strcat( dest, "$" );
strcat( dest, "cat" );
文字列を提供します"bob$cat"
。strtok
またはを使用strchr
して、文字列のリスト内の個々の文字列を検索できます。
はい、メモリを生の連続した単位として想像し、自分が何をしているのかを正確に知っている場合にのみ可能です。
例えば、
以下のように25バイトのメモリブロックを考えてみましょう
00 04
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+ 09
| | | | | |
+----+----+----+----+----+ 14
| | | | | |
+----+----+----+----+----+ 19
| | | | | |
+----+----+----+----+----+ 24
| | | | | |
+----+----+----+----+----+ 29
私の割り当てがこのようなものだったと考えてみましょう
void *p = malloc( 5 * 5 * sizeof( char ) );
次のように、純粋なポインター演算でサイズ 5 の行にアクセスできます。
たとえば、3行目の文字列をコピーするとしましょう
memcpy ( p+(5*3) , "Hello", 5 );
唯一の問題は、この raw 領域を維持することが通常より少し複雑すぎることです。さらに、使用上の利点もあります。