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 dostrNameList[1][0]
@OmkantHerp derp我没有将元素成对分组,并用“[[2]”表示。由于所有错误都已消除,现在将构建find_name。我需要传递2个参数以查找_name。+1用于我错过的常量…-asstrcpy(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盘中。容易错过的东西。无论如何,我当然喜欢。