我坚持做一些没有评分的作业(这意味着练习)。
我必须创建一个名为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的新手(我是学生),我对字符串(字符串数组等)感到困惑。
答案 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);