0

明らかに文字の配列を返すを取得しましたchar **function....問題は、配列に入力されている文字列の数がわからないことです....char *data[size_of_data];最初に設定されていますが、関数はすべてを必要としない場合があります配列フィールド....

を取得したと仮定int size_of_data = 100しますが、15 個の文字列を取得しただけです.... 15 番目の文字列の後にブレークしたい場合、C でどの条件が必要ですか... char ** フィールドに既にデータを取得し、sth like を試しました。 ...

 while(strcmp(data[i],'\0'))
{
    msg_send (session, para[0],data[i]);
    printf("------> %s \n",data[i]);
}   
4

4 に答える 4

1

実行できることの1つは、配列のサイズをoutパラメーターとして指定することです。関数のシグネチャは次のようになります

char ** function(size_t * num_strings); //num_strings is an out parameter

それからあなたはそのようなことをします

size_t nstrings = 0;
char **strings = function(&nstrings);
size_t i = 0;
while (i < nstrings) {
    //do stuff
}

nullポインターに到達するまで繰り返すのではなく、サイズを知ることには利点があります。100の配列を準備したとしますchar*。それらをすべて使用するとどうなりますか?nullポインターはなく、バッファーをオーバーランすることになります。もちろん、最後に区切り文字としてポインタを追加することもできますが、個人的にはサイズが好きです。

于 2012-08-23T19:48:38.727 に答える
1

基本的に、実行できる一般的な方法は2つあります。1つは、配列の終わりをnullpointerで示す規則か、要素の数を保持structする追加を含むaを返す方法です。size_tイテレータイディオムを使用した2番目のバージョンのバリエーションもあります。

終了はnullです:

char** fun() {
  /* ... */
  char** array = /*...*/;
  unsigned end = 15;
  array[end] = NULL;
  return array;
}

呼び出し元は、に遭遇すると、結果配列からの読み取りを停止しNULLます。

別サイズ

struct {
  size_t size;
  char** array;
} fun() {
   /* ... */
   char** array = /*...*/;
   unsigned end = 15;
   return {end,array};
}

イテレータイディオム(C ++から貸与)

struct {
  char** begin;
  char** end;
} fun() {
   /* ... */
   char** array = /*...*/;
   unsigned end = 15;
   return {array,array+end};
}

これには、ループでうまく使用できるという利点があります。

for (struct {char** begin; char** end;} it = fun(); it.begin != it.end; ++it.begin) {
  printf("%s\n",it.begin);
}

また、を引くことでサイズを簡単に決定することもできますend - begin

于 2012-08-23T19:50:06.030 に答える
1

char ** 関数では、配列の最後に NULL ポインターを配置できます。したがって、この場合は 15 番目の文字列の後に NULL を入れます。次に、 while ループで data[i] == NULL をチェックします。それが最後である場合。

于 2012-08-23T19:34:30.863 に答える
1

これを行う正しい方法は、使用されていない最初の場所でデータ配列にヌル ポインター (0) を配置する関数を持つことです。

これは、現在のポインターが 0 であるかどうかを確認することで簡単にテストできます。

for (i = 0; data[i]; i++) {
    puts(data[i]);
}
于 2012-08-23T19:36:00.667 に答える