7

我被困在一些没有评分的作业上(它意味着练习)。

我必须创建一个find_name需要 2 个参数的函数。第一个参数是一个二维名称数组(字符串),第二个参数是一个字符串,用于在二维数组中查找名称,如果找到则函数必须返回 1,否则返回 0。

当我调用该函数(现在为空)时,我得到了这个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 指针的二维数组。您对 strNameList 的声明在程序的两个位置都不正确。你有:

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

但是char[][N]声明了一个 2D 数组chars,而不是char*因此编译器警告您将大量指针值分配给类型的项目char

您的声明(您的变量函数参数)更改为:

const char *strNameList[][2]

它声明了一个长度未知的数组 two char*,它现在与您的初始化列表匹配。此外,const添加 是因为(a)我假设您不打算在函数中修改该名称列表,并且(b)char*通过初始化程序分配给的可写字符串文字声明在 C 中是未定义的行为,并且在 C++ 中正式弃用,所以无论如何你都不应该使用它。同样,您的查找名称也可能没有被修改,因此也要声明它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) 使用find_name()知道的令牌值终止列表,或者 (b) 将列表中的名称数量传递给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()正在寻找一个二维字符数组,即:

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 回答