不兼容的指针类型错误[C]

问题描述 投票:0回答:10

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

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 
c pointers types arguments
10个回答
4
投票

linear_search 需要数据类型“

char **
”。 您传递的是
argv[i]
,这只是一个
char*
。 尝试像这样传入“argv”:

if (linear_search(size_of_A, argv))

2
投票

您的

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

另外(尽管这不会改变程序的行为):

i
中的变量
main
从未真正使用过。您可以删除它和
i = i + 1;
说明。


1
投票

您正在将参数(第二个)传递给

linear_search
函数,该函数与参数的预期类型不匹配。 argv[i] 的类型为
char *
,通常称为字符串,而
linear_search
函数需要
char * []
,它是字符串数组。


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 中从未真正使用过,您可以安全地删除处理它的两行。


0
投票

您的函数需要一个

char*[]
(在本例中应该相当于
char**
)。然而,通过调用它

linear_search (size_of_A, argv[i])

您只是传递一个

char*
作为参数(因为
[i]
取消引用一个指针)。从我在你的代码中看到的你可以尝试使用

linear_search (size_of_A, argv+i)

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


0
投票
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
所声明的。

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


0
投票

您的 Linear_search() 接受一个“字符串数组”(指向字符数组的指针),同时您向它传递一个“字符串”(argv[i])。我认为你想做的是将 Linear_search 称为:

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

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


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

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 必须始终尽可能简洁,但是......我仍然建议不要这样做。


0
投票

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
。 别让我开始谈论神奇的数字。 这年头的孩子们。

嘿,孩子,离开我的草坪

© www.soinside.com 2019 - 2024. All rights reserved.