使用字符串的2D数组

时间:2012-11-21 20:28:07

标签: c arrays string

我坚持做一些没有评分的作业(这意味着练习)。

我必须创建一个名为find_name的函数,它接受2个参数。第一个参数是名称(字符串)的2D数组,第二个参数是用于在2D数组中查找名称的字符串,如果找到则函数必须返回1。

当我调用该函数时(现在为空),我得到了这个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的新手(我是学生),我对字符串(字符串数组等)感到困惑。

3 个答案:

答案 0 :(得分:9)

我假设你想要一个二维char指针数组。您在程序中两个位置的strNameList声明不正确。你有:

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

但是char[][N]声明了一个 chars 的二维数组,而不是char*因此,编译器会警告您正在分配一堆指针值为char

类型的项目

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

const char *strNameList[][2]

声明一个包含两个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)使用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)

答案 1 :(得分: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)。{/ p>


<强>更新

您可以在带有名称的阵列中添加一个塞子元素,然后不需要随阵列本身一起传递阵列的大小,因为大小总是可以通过扫描阵列成员直到找到塞子来确定。

答案 2 :(得分:1)

您的函数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);