C 错误预期为‘char **’,但参数类型为‘char (*)[10]’

C error expected ‘char **’ but argument is of type ‘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 != '[=11=]')
    {
        *p++;
    }

    while(*q != '[=11=]')
    {
        **p = *q;
        (*p)++;
        q++;
    }
    *p = '[=11=]';

}

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

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

不是 指向 char 的指针,而是传递 指向 char[=19= 的指针],它也会使修改永久化。这几乎就是 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 != '[=10=]')
    {
        ptr++;
    }

    while(*q != '[=10=]')
    {
        *ptr = *q;
        ptr++; /* you dont have to dereference */
        q++;
    }
    *ptr = '[=10=]';

    return p;
}

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

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

    return 0;
}

变量 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 != '[=14=]')
{
    *p++;
}

因为表达式

*p++

等同于表达式

*( p++ )

而你需要表达式

( *p )++

++*p

或者最后一个语句应该是

**p = '[=19=]';

而不是

*p = '[=20=]';

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

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

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

所以函数可以看成下面的样子

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

    while ( *s ) ++s;

    while ( ( *s++ = *q ) != '[=22=]' ) ++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 ) != '[=24=]' ) ++q;

    return p;
}

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

程序输出为

ravira

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

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 != '[=11=]')
{
 (*p)++;
}