7

採点されていない宿題に行き詰まっています(練習用です)。

find_name2 つの引数を取る関数を作成する必要があります。最初の引数は名前 (文字列) の 2D 配列で、2 番目の引数は 2D 配列で名前を検索するために使用される文字列です。

関数(現在は空)を呼び出すと、これが得られますwarning: passing argument 1 of 'find_name' from incompatible pointer type

ここに重要なビットがあります。

メインで

 char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"},{"Abdul","Justin"}, {"Nina","Marlene"},{"Donny","Kathlene"} };

char strFindName[] = "\0";
    printf("Please enter a name to look for: ");
    gets(strFindName);
    nSearch = find_name(strNameList, strFindName);

関数

int find_name(char strNameList[][2], char strLookUp[])

私は C が初めてで (私は学生です)、文字列 (文字列配列など) について完全に混乱しています。

4

3 に答える 3

12

char ポインタの 2D 配列が必要だと仮定しています。strNameList の宣言は、プログラムの両方の場所で正しくありません。あなたが持っている:

char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"},{"Abdul","Justin"}, {"Nina","Marlene"},{"Donny","Kathlene"} };

しかしchar[][N]、 の 2D 配列を宣言しているのでcharsはなくchar*、コンパイラから警告が表示されます。char

両方の宣言 (変数関数パラメーター) を次のように変更します。

const char *strNameList[][2]

これは、配列の不明な長さの配列 of two を宣言しchar*ます。これは、初期化リストと一致するようになりました。また、const(a) 関数内でその名前リストを変更する予定はないと想定しているため、(b)char*イニシャライザを介して割り当てられた書き込み可能な文字列リテラル宣言は C では未定義の動作であり、C++ では公式に非推奨であるため、が追加されています。したがって、関係なく使用するべきではありません。同様に、あなたの lookup-name もおそらく変更されていないので、それも宣言してconstください。

結果:

const char * strNameList[][2] = { 
    {"Luca","Daniel"} ,
    {"Vivan","Desmond"},
    {"Abdul","Justin"}, 
    {"Nina","Marlene"},
    {"Donny","Kathlene"} 
};

そしてあなたの機能で:

int find_name(const char * strNameList[][2], const char strLookUp[])

最後になりましたが、水晶玉を持っていない限り、渡された名前リストに含まれる名前の数find_name()を関数が特定の情報で知る方法はありません。後で何が起こったのか考えるよりも、今これを見たほうがいいと思います。(a) 知っているトークン値でリストを終了するか、 (b) リスト内の名前の数を に渡す必要があります。それぞれに独自のものですが、私はこれらのうち後者を好みます。find_name()find_name()

int find_name(const char * strNameList[][2], size_t nNameListSize, const char strLookUp[])

呼び出し元側で次のように呼び出します。

find_name(strNameList, sizeof(strNameList)/sizeof(strNameList[0]), strFindName)
于 2012-11-21T20:43:19.087 に答える
5

このようにしてください:

#define STOPPER_NAMELIST NULL

char * strNameList[][2] = { 
  { "Luca","Daniel"},
  {"Vivan","Desmond"},
  {"Abdul","Justin"}, 
  {"Nina","Marlene"}, 
  {"Donny","Kathlene"} 
  {STOPPER_NAMELIST, STOPPER_NAMELIST}
};

size_t sizeNameList(const char * strNameList[][2])
{
  size_t size = 0;

  while ((strNameList[size][0] != STOPPER_NAMELIST) && 
         (strNameList[size][0] != STOPPER_NAMELIST))
    ++ size;

  return size;
}

int find_name(char * strNameList[][2], char strLookUp[])
{
   size_t size = sizeNameList(strNameList);

   ...
}

...

nSearch = find_name(strNameList, strFindName);

このアプローチでは、エントリを持つ配列のオープン配列 ( []) を使用します。char *2


アップデート:

名前を保持する配列にストッパー要素を追加できます。その後、ストッパーが見つかるまで配列メンバーをスキャンすることでサイズを常に決定できるため、配列自体と一緒に配列のサイズを渡す必要はありません。

于 2012-11-21T20:43:57.170 に答える
2

関数find_name()は文字の 2 次元配列を探しています。

char arr[][2] = { { 'a', 'b'}, ...

それらを文字列にしたい場合は、次のものが必要です。

char *arr[][2] = { {"John", "Smith"}, ...

次に、関数のパラメーター リストに次のものが必要です。

void find_name(char *something[][2])
{
   printf("first name: %s, second name: %s\n", something[0][0], something[0][1]);

そして、main()関数内で次のように呼び出します。

find_name(arr);
于 2012-11-21T20:47:00.123 に答える