C 使用字符串的二维数组

C 使用字符串的二维数组,c,arrays,string,C,Arrays,String,我被一些没有评分的作业卡住了(这是为了练习) 我必须创建一个名为find_name的函数,该函数包含两个参数。第一个参数是名称(字符串)的二维数组,第二个参数是用于在二维数组中查找名称的字符串,如果找到,函数必须返回1,否则返回0 当我调用这个函数(现在是空的)时,我得到了这个警告:从不兼容的指针类型传递'find_name'的参数1 这里是重要的一点 主菜单中的 char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"}

我被一些没有评分的作业卡住了(这是为了练习)

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

当我调用这个函数(现在是空的)时,我得到了这个
警告:从不兼容的指针类型传递'find_name'的参数1

这里是重要的一点

主菜单中的

 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语言的新手(我是一名学生),对字符串(字符串数组等)完全感到困惑。

我假设您需要一个2D字符指针数组。在程序中的两个位置,您的strNameList声明都不正确。你有:

char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"},{"Abdul","Justin"}, {"Nina","Marlene"},{"Donny","Kathlene"} };
但是
char[][N]
正在声明一个
char
的2D数组,而不是
char*
,因此编译器会警告您正在为
char
类型的项分配大量指针值

将声明(变量和函数参数)更改为:

它声明了一个长度未知的数组,该数组包含两个
char*
,现在与您的初始化列表匹配。此外,由于代码(>)我假设您没有在函数中修改该名称列表,并且(b)通过初始化器分配给<代码> char */COD>的可写字符串文字声明是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\u name()
知道的令牌值终止列表,或者(b)将列表中的名称数传递给
find\u name()
。每个人都有自己的,但我更喜欢后者:

int find_name(const char * strNameList[][2], size_t nNameListSize, const char strLookUp[])
并通过以下方式在调用方一侧调用它:

find_name(strNameList, sizeof(strNameList)/sizeof(strNameList[0]), strFindName)
这样做:

#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个
条目


更新:


您可以向带有名称的数组中添加一个stopper元素,这样就不需要将数组的大小与数组本身一起传递,因为可以通过扫描数组成员直到找到stopper来确定大小。

您的函数
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]);
然后在功能参数列表中,您需要:

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);

您想声明什么
char*strNameList[][2]
char-strNameList[][2]
?哎呀,我有char-strNameList,不是char*strNameListI。我现在就知道了。警告:数组初始值设定项中的元素过多|警告:(接近“strNameList[0]”的初始化)是的,你修改了find_名称,我正在查找旧名称..+1为了让Luca只做
strNameList[0][0]
和Vivan do
strNameList[1][0]
@OmkantHerp derp我没有将元素成对分组,并用“[[2]”表示。由于所有错误都已消除,现在将构建find_name。我需要传递2个参数以查找_name。+1用于我错过的
常量…-as
strcpy(strNameList[0][0],“alk”)gcc
“通过初始值设定项分配给char*的可写字符串文字声明是不推荐使用的C功能”,code>至少会使应用程序崩溃。那不完全是真的。它在C++中被弃用,C C字符串中的有效字符不是“代码> const ”,但修改它们是未定义的行为:*“………………如果程序试图修改这样一个数组,行为是未定义的”(C114.5/7,String Literals)@ NETCODER,我真的需要选择一种语言并坚持下去。每次我和一个一起工作,它都会在另一个面前摩擦。前几天我在C++中宣布了一个VLA,盯着它看了10分钟,试图记住为什么它不会编译。谢谢,先生,我会更新答案。不一定需要传递数组的大小,因为数组是由一个stopper元素终止的。请看我的答案。@alk-sok。盯着足够多的帖子看,最后它们都和玛丽娜一起融入了巨大的linguini盘中。容易错过的东西。无论如何,我当然喜欢。