2

我一直被告知在这行代码中从不兼容的指针类型传递参数。
这是代码行:

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 
4

10 回答 10

4

linear_search 需要一个数据类型“ char **”。您正在传递argv[i],这只是一个char*. 尝试像这样传递“argv”:

if (linear_search(size_of_A, argv))
于 2009-04-15T05:25:54.923 回答
2

你有一个逻辑错误linear_search。您有一个基于 的值的 while 循环i,但i永远不会改变。您可能缺少i++;说明。

另外(尽管这不会改变程序的行为):变量iinmain从未真正使用过。您可以删除它和i = i + 1;说明。

于 2009-04-15T05:41:58.597 回答
1

您正在将参数(第二个)传递给与参数linear_search的预期类型不匹配的函数。argv[i] 的类型char *是 ,通常称为字符串,而linear_search函数 expectschar * []是字符串数组。

于 2009-04-15T05:25:54.860 回答
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 中使用,您可以安全地删除处理它的两行。

于 2009-04-15T05:46:54.077 回答
0

oldfart:当心strcmp所有无限的字符串函数(如 strcpy——但要小心 strncpy:它不会添加尾随 NULL)。

youngun: 但没关系,因为argv有一堆以 NULL 结尾的字符串!

of:这种思维方式导致了缓冲区溢出的大量帮助。 argv用 NULLS 初始化。但从那以后它可能已经改变了。

y:但这是一个小程序,它永远不会发生。

的:当然。程序会增长,并且“从未”发生的频率比您想象的要多。

y:好的,偏执狂先生,我应该用多大的尺寸来限制我的strncmp?没有明显的数字可以使用!你是在建议我编造一些东西吗?

of:参见limits.h,尤其ARG_MAX_POSIX_ARG_MAX可能的最大值。如果您愿意,可以使用较小的值。如果您这样做,请记录下来

y:所以我应该写strncmp( arg, target, 5000 )?好吧,偏执狂先生。

作者:不要那样做! #define APP_MAX_ARG 5000然后使用strncmp( arg, target, APP_MAX_ARG ). 不要让我开始使用魔术数字。现在的孩子。

作者:嘿,孩子,离开我的草坪

于 2009-04-15T18:42:35.647 回答
0

这似乎是使用以下事实的好地方argv is NULL-terminated. You don't need to pass the count of items in it, but just do like this:

/* 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;
}

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表示比较元素之间的关系。

我实现了使用!这里很常见,几乎是惯用的,因为许多人认为 C 必须始终尽可能简洁,但是......我仍然建议不要这样做。

于 2009-04-15T13:47:29.820 回答
0

您的函数需要 a char*[](在这种情况下应该等效于char**)。但是,通过调用它

linear_search (size_of_A, argv[i])

你只是传递一个char*as 参数(因为[i]取消引用一个指针)。根据我在您的代码中看到的内容,您可以尝试使用

linear_search (size_of_A, argv+i)

但我不太确定这是否会产生预期的行为。理解 C 还为时过早 :)

于 2009-04-15T05:26:53.097 回答
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;  
} 
于 2009-04-15T05:28:50.970 回答
0
int linear_search ( int size_of_A, char*argv[]){ 

char*argv[]表示“指向字符数组的指针”;作为函数调用参数,与char**.

argva char**,但是argv[i]是 a char*,因为 C 定义argv[i]*(argv + i )or,用英文“dereference (argv plus i)”定义。取消引用 a会给char**您留下 a char*,而这不是linear_search声明要采用的。

如果您仍然感到困惑,请看这里。
`

于 2009-04-15T05:31:03.523 回答
0

您的 linear_search() 接受“字符串数组”(指向字符数组的指针),而您将其传递给“字符串”(argv [i])。我认为您想要做的是将 linear_search 称为:

if (linear_search (size_of_A, (argv + i)))

虽然我不完全理解你程序的逻辑......你是否试图在后面的参数中搜索 argv[1] ......?

于 2009-04-15T05:33:35.623 回答