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

C 错误应为“char **”,但参数的类型为“char (*)[10]”

如何解决C 错误应为“char **”,但参数的类型为“char (*)[10]”

我正在尝试实现我的 strcat 版本。但是,我收到以下警告,并且我的代码在运行时崩溃。我正在从 main 传递 &p 以对 main 函数中的变量 p 进行永久更改。

警告:

note: expected ‘char **’ but argument is of type ‘char (*)[10]’

代码

#include<string.h>
#include<stdio.h>

void mystrcat(char **p,char *q)
{
    while(**p != '\0')
    {
        *p++;
    }

    while(*q != '\0')
    {
        **p = *q;
        (*p)++;
        q++;
    }
    *p = '\0';

}

int main()
{
    char p[10]="ravi";
    char q[12]="ra";

    mystrcat(&p,q);
    printf("%s",p);
}

解决方法

变量 p 被声明为具有类型 char[10]

char p[10]="ravi";

所以这个调用中的表达式 &p

mystrcat(&p,q);

具有 char ( * )[10] 类型。

但是相应的函数参数具有 char ** 类型。

void mystrcat(char **p,char *q)

并且没有从 char ( * )[10] 类型到 char ** 类型的隐式转换,所以编译器会报错。

您可以通过以下方式调用您的函数

char *tmp = p;
mystrcat( &tmp,q );

但无论如何,至少由于这个while循环,函数是不正确的

while(**p != '\0')
{
    *p++;
}

因为表达

*p++

等价于表达式

*( p++ )

虽然你需要表达

( *p )++

++*p

或者最后一句应该是

**p = '\0';

代替

*p = '\0';

将第一个函数参数声明为类型 chat ** 而不是类型 char * 没有任何意义,因为它是在标准 C 函数 strcat 中声明的。

char * strcat(char * restrict s1,const char * restrict s2);

此外,第二个参数应具有限定符 const,因为相应的字符串在函数内未更改。并且该函数应该返回一个指向目标字符串的指针。

所以函数可以如下所示

char * mystrcat( char *p,const char *q )
{
    char *s = p;

    while ( *s ) ++s;

    while ( ( *s++ = *q ) != '\0' ) ++q;

    return p;
}

并被称为

puts( mystrcat( p,q ) );

这是一个演示程序。

#include <stdio.h>

char * mystrcat( char *p,const char *q )
{
    char *s = p;

    while ( *s ) ++s;

    while ( ( *s++ = *q ) != '\0' ) ++q;

    return p;
}

int main(void) 
{
    char p[10] = "ravi";
    char q[12] = "ra";
    
    puts( mystrcat( p,q ) );
    
    return 0;
}

程序输出为

ravira
,

不是指向char指针的指针,只需传递一个指向char的指针,它也会使修改永久化。这几乎就是 string.h strcat 的工作原理。也许还检查 NULL 指针。

#include <stdio.h>
#include <stdlib.h>

char *mystrcat(char *p,char *q)
{
    char *ptr = p; /* so you dont alter p's initial address */

    if (p == NULL || q == NULL)
    {
        exit(EXIT_FAILURE);
    }

    while(*ptr != '\0')
    {
        ptr++;
    }

    while(*q != '\0')
    {
        *ptr = *q;
        ptr++; /* you dont have to dereference */
        q++;
    }
    *ptr = '\0';

    return p;
}

int main(void)
{
    char p[100]="hello";
    char q[12]="world";

    mystrcat(p,q);
    printf("%s",p);

    return 0;
}
,

您需要传递一个指向数组中每个字符的指针:

int main()
{
 char p[10]="ravi5";
 char q[12]="ra54";
 
 char* pPointer = p;
 char** pPointerPointer = &pPointer;

 mystrcat(pPointerPointer,q);
 printf("%s",p);
 return 0;
}

注意:在你的 strcat 函数中你错过了括号:

while(**p != '\0')
{
 (*p)++;
}

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