我不断被告知在这行代码中从不兼容的指针类型传递参数 这是代码行:
if (linear_search (size_of_A, argv[i]))
这是什么意思,我该如何解决?这是整个计划:
int linear_search ( int size_of_A, char*argv[]){
int i;
i = 2;
while (i <= size_of_A - 1){
if (!strcmp (argv [1], argv[i])){
return 1;
}
}
return 0;
}
int main (int argc, char*argv []){
int size_of_A = argc - 2;
int i = 2;
if (linear_search (size_of_A, argv)){
printf ("%s not found\n", argv [1]);
return 1;
} else{
printf ("%s found\n", argv[1]);
return 0;
}
i = i + 1;
}
}
好的,这修复了警告,但现在当我通过编译器运行程序时没有任何反应。它应该告诉我第一个论点是否重复 例如,输出看起来像:
./a 3 hso 8 3
3 found
答案 0 :(得分:4)
linear_search期待数据类型“char **
”。您正在传递argv[i]
,这只是char*
。尝试传递“argv”,如下所示:
if (linear_search(size_of_A, argv))
答案 1 :(得分:2)
linear_search
中存在逻辑错误。您有一个基于i
值的while循环,但i
永远不会更改。您可能缺少i++;
指令。
另外(虽然这不会改变程序的行为):i
中的变量main
从未真正使用过。您可以删除它和i = i + 1;
指令。
答案 2 :(得分:1)
您正在将参数(第二个)传递给linear_search
函数,该函数与参数的预期类型不匹配。 argv [i]的类型为char *
,通常称为字符串,而linear_search
函数需要char * []
,这是一个字符串数组。
答案 3 :(得分:1)
您的线性搜索功能仅将argv [1]与argv [2]进行比较,因为 i 永远不会增加。一个可能的解决方案(使用for循环而不是while,这是更常见的)将是:
int linear_search ( int size_of_A, char*argv[]){
int i = 0; // should always initialize in construction
for ( i = 2; i < size_of_A; ++i ) {
if (!strcmp (argv [1], argv[i])){
return 1;
}
}
return 0;
}
变量 i 永远不会在main中使用,你可以安全地删除处理它的两行。
答案 4 :(得分:0)
您的函数需要char*[]
(在本例中应该等同于char**
)。但是,通过
linear_search (size_of_A, argv[i])
您只是传递char*
作为参数(因为[i]
取消引用一个指针)。从我在您的代码中看到的,您可以尝试使用
linear_search (size_of_A, argv+i)
但我不确定这是否会产生预期的行为。还是太早了解C:)
答案 5 :(得分:0)
我不知道你的程序的逻辑,但编译器错误已经解决。 见:
int main(int argc,char * argv []){
int size_of_A = argc - 2;
int i = 2;
if (linear_search (size_of_A, argv[])){
printf ("%s not found\n", argv [1]);
return 1;
}
答案 6 :(得分:0)
int linear_search ( int size_of_A, char*argv[]){
char*argv[]
表示“指向char数组的指针”;作为函数调用参数,与char**
相同。
argv 是char**
,但argv[i]
是char*
,因为C将argv[i]
定义为*(argv + i )
或者,英语“dereference(argv plus i)”。取消引用char**
会为您留下char*
,并且不是linear_search
宣布的内容。
答案 7 :(得分:0)
你的linear_search()接受一个“字符串数组”(指向字符数组的指针),而你传递一个“字符串”(argv [i])。我想你想做的是将linear_search称为:
if (linear_search (size_of_A, (argv + i)))
虽然我不完全理解你的程序的逻辑......你是否试图在后面的论证中搜索argv [1] ......?
答案 8 :(得分:0)
这似乎是使用表达比较元素之间关系的argv
is
NULL
-terminated. You don't need to pass the count of items in it, but just do like this:
is NULL
-terminated. You don't need to pass the count of items in it, but just do like this:
NULL
这一事实的好地方。
我意识到使用了!这里很常见,几乎是惯用的,因为很多人认为C必须总是尽可能简洁,但是......我仍然建议反对它。
答案 9 :(得分:0)
oldfart:谨防strcmp
和所有无限制的字符串函数(如strcpy - 但要注意strncpy:它不会添加尾随的NULL)。
youngun:但是没关系,因为argv
有一堆以NULL结尾的字符串!
of:这种思维方式会导致缓冲区溢出的堆积。使用NULLS初始化argv
。但从那以后它可能会发生变化。
y:但这是一个小程序,它永远不会发生。
:当然。程序的增长和“永远”发生的次数比你想象的要快。
y:好的,Paranoid先生,我应该用什么尺寸来限制strncmp
?没有明显的数字可供使用!你建议我做点什么吗?
:请参阅limits.h,特别是ARG_MAX
和_POSIX_ARG_MAX
,了解可能的最大值。如果您愿意,可以使用较小的值。如果您这样做,记录。
y:所以我应该写strncmp( arg, target, 5000 )
?好的,先生偏执狂。
:不要这样做! #define APP_MAX_ARG 5000
然后使用strncmp( arg, target, APP_MAX_ARG )
。不要让我开始使用魔法数字。这些天孩子们。
:嘿,孩子,离开我的草坪。