char
ユーザーまたはアプリケーションによって与えられた配列があります"Hello,My,Name,Is,Test"
。
私ができる必要があるのは、コンマの数や文字列のサイズがわからないため、これを動的配列に格納するコンマでこれを分割することです。
これを保存して、次のような別の方法で各アイテムを個別にリクエストできるようにする必要があります
GetItem(int index)
{
...
return Array[index];
...
}
文字列内のコンマの数がわからず、上限さえない場合は、文字列を解析して配列を動的に再割り当てする必要があります。いくつかの戦略があり、以下の戦略はメモリの断片化を助長するため、実際には最適ではありませんが、説明するのは簡単です。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *str = "This,is,a,comma,delimited,string,with,a,length,of,whatever";
char **array = NULL;
char *p;
size_t items = 0, q;
char *sepa = ",";
p = str;
for (;;)
{
p += strspn(p, sepa);
if (!(q = strcspn(p, sepa)))
break;
if (q)
{
array = realloc(array, (items+1) * sizeof(char *));
array[items] = malloc(q+1);
strncpy(array[items], p, q);
array[items][q] = 0;
items++;
p += q;
}
}
for (q = 0; q < items; q++)
{
printf("(%s) ", array[q]);
}
printf("\n");
/* Here we have a problem. How do we return to the caller the information
about how many items do we have? A common solution is to return the number
of items PLUS ONE, and that one is NULL */
array = realloc(array, (items+1) * sizeof(char *));
array[items] = NULL;
/* So this code can work without needing to know the value of "items" */
for (q = 0; array[q]; q++)
printf("(%s) ", array[q]);
printf("\n");
}
ところで、realloc
(またはmalloc
) が NULL を返すかどうかのチェックを省略しました。これは、メモリ エラーを意味します。
別の割り当て戦略はrealloc
、チャンクで使用することです。つまり、2 つのカウンター と を保持items
しreally_allocated_items
、2 つが等しい場合にのみ再割り当てします。その場合really_allocated_items
、たとえば 64 ずつインクリメントし、その数のアイテムを再割り当てします。この方法では、64 回ごとに 1 つの割り当てのみを実行し、多くても 63 個のポインターを浪費します。
固定の 64 の代わりに増分チャンク サイズを使用する他の戦略が存在しますが、それらはメモリとパフォーマンスの制約が非常に厳しい場合にのみ実装されます。
元の文字列を変更し、場合によってはこれが許可されない可能性があるため (コアダンプを取得する可能性さえある)、この実装では意図的に を使用しないことに注意してください。strtok
strtok
strtok()
未満の最大語長を使用した単純な実装10
他の方法でも実行できます。これを忘れないでください。#include<string.h>
char str[] = "Hello,My,Name,Is,Test";
char delims[] = ",";
char *result =NULL;
char final[10][10];
int i=0;
result = strtok( str, delims );
strcpy(final[i],result);
i++;
while( result != NULL ) {
result = strtok( NULL, delims );
strcpy(final[i],result);
i++;
}
脚注 : ここでの最初の呼び出しは最初のパラメーターとしてstrtok()
使用str
されますが、後続のすべての呼び出しにはNULL