微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于不兼容指针类型的警告 - c

如何解决关于不兼容指针类型的警告 - c

我从我的主函数调用我的函数...

int main() {

   char* input[81];
   char** array[81];

   userInput(input);

   parseInput(input);

}

userInput 接受输入并存储在输入变量中。这工作正常。

但现在我想将输入和字符指针数组都发送到我的 parseInput 函数,以使用 strtok 将输入解析为数组

以下是我的 parseinput() 函数...

void parseInput(char* in) {

   char *tok = strtok(in," ");

   int i = 0;
   while(tok != NULL) {

      array[i] = tok;
      tok = strtok(NULL," ");
      i++;

   }

}

当我尝试编译时收到以下警告,但我不明白为什么。

警告:从不兼容的指针类型传递“userInput”的参数 1 [认启用] 用户输入(输入);

警告:从不兼容的指针类型传递“parseInput”的参数 1 [认启用] 解析输入(输入,数组);

任何指导将不胜感激。谢谢

解决方法

您将函数 parseInput 定义为接受类型为 char* 的参数,但在函数 main 中,您向其传递类型为 {{1} 的 decayed 参数}}。这就是您的编译器抱怨指针类型不兼容的原因。

代替

char**

你可能应该写:

char* input[81];

还有声明

char input[81];

可能应该改为:

char** array[81];

另外,正如评论部分已经指出的,函数 char* array[81]; 不会编译,因为它引用了一个标识符 parseInput,但没有具有该名称的标识符对该函数可见。它看不到函数 array 的标识符 array。因此,如果您希望函数main 可以访问函数parseInput 中的array,那么在调用main 时,您必须传递一个指向该数组的指针。

您的代码的另一个问题是函数 parseInput 的行为没有意义,因为该函数的调用者(在本例中为 parseInput)无法知道有多少个元素指针数组的内容由 main 写入。因此,它无法知道函数调用后数组中有多少元素是有效的。出于这个原因,让函数 parseInput 返回一个 parseInput 可能更有意义,它指定写入的数组元素的数量。

另一个问题是函数 int 只是假设传递的数组足够大。如果该假设为假,则将导致 buffer overflow。因此,将函数 parseInput 设计为这样一种方式可能会更安全,即还传递一个指定所传递数组大小的参数,以便函数可以在缓冲区溢出发生之前停止。>

应用上述所有修改后,函数 parseInput 将如下所示:

parseInput

而不是像这样调用函数

int parseInput( char* in,char** results,int results_length )
{
    char *tok = strtok(in," ");

    int i = 0;
    while( tok != NULL && i < results_length )
    {
        results[i] = tok;
        tok = strtok(NULL," ");
        i++;
    }

    return i;
}

你现在可以这样称呼它:

parseInput(input);

此测试程序提供以下输出:

int main(void)
{
    char input[81] = "This is a test.";
    char* array[81];
    int num_elements;

    num_elements = parseInput( input,array,sizeof array / sizeof *array );

    for ( int i = 0; i < num_elements; i++ )
    {
        printf( "%s\n",array[i] );
    }

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。