我不断被告知在这行代码中从不兼容的指针类型传递参数。
这是代码行:
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
linear_search 需要数据类型“
char **
”。 您传递的是 argv[i]
,这只是一个 char*
。 尝试像这样传入“argv”:
if (linear_search(size_of_A, argv))
您的
linear_search
有逻辑错误。您有一个基于 i
值的 while 循环,但 i
永远不会改变。您可能缺少 i++;
说明。
另外(尽管这不会改变程序的行为):
i
中的变量 main
从未真正使用过。您可以删除它和 i = i + 1;
说明。
您正在将参数(第二个)传递给
linear_search
函数,该函数与参数的预期类型不匹配。 argv[i] 的类型为 char *
,通常称为字符串,而 linear_search
函数需要 char * []
,它是字符串数组。
您的线性搜索函数仅将 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 中从未真正使用过,您可以安全地删除处理它的两行。
您的函数需要一个
char*[]
(在本例中应该相当于 char**
)。然而,通过调用它
linear_search (size_of_A, argv[i])
您只是传递一个
char*
作为参数(因为 [i]
取消引用一个指针)。从我在你的代码中看到的你可以尝试使用
linear_search (size_of_A, argv+i)
但我不太确定这是否会产生预期的行为。理解 C 还太早:)
int linear_search ( int size_of_A, char*argv[]){
char*argv[]
表示“指向字符数组的指针”;作为函数调用参数,与char**
相同。
argv 是 a
char**
,但是 argv[i]
是 char*
,因为 C 将 argv[i]
定义为 *(argv + i )
,或者用英语“取消引用 (argv plus i)”。取消引用 char**
会留下 char*
,而这并不是 linear_search
所声明的。
如果您仍然感到困惑,请看一下这里。
`
您的 Linear_search() 接受一个“字符串数组”(指向字符数组的指针),同时您向它传递一个“字符串”(argv[i])。我认为你想做的是将 Linear_search 称为:
if (linear_search (size_of_A, (argv + i)))
虽然我不完全理解你程序的逻辑...你是否试图在后面的参数中搜索argv[1]...?
我不知道你的程序的逻辑,但编译器错误已解决。 看看这个:
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;
}
这似乎是使用
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 必须始终尽可能简洁,但是......我仍然建议不要这样做。
oldfart: 当心
/* Searches through the NULL-aterminated array for the.
* given needle string. Returns 1 if found, 0 if not.
*/
int linear_search (char **argv, const char *needle)
{
int i;
for(i = 0; argv[i] != NULL; i++)
{
if(strcmp(argv[i], needle) == 0)
return 1;
}
return 0;
}
和所有无限的字符串函数(如 strcpy——但要小心 strncpy:它不会添加尾随 NULL)。
youngun: 但是没关系,因为
/* Searches through the NULL-aterminated array for the.
* given needle string. Returns 1 if found, 0 if not.
*/
int linear_search (char **argv, const char *needle)
{
int i;
for(i = 0; argv[i] != NULL; i++)
{
if(strcmp(argv[i], needle) == 0)
return 1;
}
return 0;
}
有一堆以 NULL 结尾的字符串!
of: 这种思维方式会导致缓冲区溢出的严重后果。
/* Searches through the NULL-aterminated array for the.
* given needle string. Returns 1 if found, 0 if not.
*/
int linear_search (char **argv, const char *needle)
{
int i;
for(i = 0; argv[i] != NULL; i++)
{
if(strcmp(argv[i], needle) == 0)
return 1;
}
return 0;
}
已用 NULL 初始化。 但从那时起,情况可能会发生变化。
y:但这只是一个小程序,它永远不会发生。
of: 当然可以。程序不断发展,但“永远”发生的频率比您想象的要高。
y: 好吧,偏执狂先生,我应该使用什么尺寸来限制我的
Btw, I recommend comparing the return value of strcmp()
nagainst literal 0, rather than using the ! notation, since the return value is in fact not boolean; it returns a int
? 没有明显的数字可以使用! 你是建议我编点什么吗?
of: 请参阅 limit.h,特别是
Btw, I recommend comparing the return value of strcmp()
和 strcmp
了解可能的最大值。 如果您愿意,可以使用较小的值。 如果您这样做,记录下来。
y: 所以我应该写
argv
? 好吧,偏执先生。
of: 不要这样做!
argv
,然后使用 strncmp
。 别让我开始谈论神奇的数字。 这年头的孩子们。
:嘿,孩子,离开我的草坪。