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

Rav*_*avi 3 c pointers c-strings strcat function-definition

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

\n

警告:

\n
note: expected \xe2\x80\x98char **\xe2\x80\x99 but argument is of type \xe2\x80\x98char (*)[10]\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

代码:

\n
#include <string.h>\n#include <stdio.h>\n\nvoid mystrcat(char **p, char *q)\n{\n    while (**p != '\\0')\n    {\n        *p++;\n    }\n\n    while (*q != '\\0')\n    {\n        **p = *q;\n        (*p)++;\n        q++;\n    }\n    *p = '\\0';\n}\n\nint main()\n{\n    char p[10] = "ravi";\n    char q[12] = "ra";\n\n    mystrcat(&p, q);\n    printf("%s", p);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Vla*_*cow 6

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

char p[10]="ravi";
Run Code Online (Sandbox Code Playgroud)

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

mystrcat(&p, q);
Run Code Online (Sandbox Code Playgroud)

有类型char ( * )[10].

然而,相应的函数参数具有类型char **

void mystrcat(char **p, char *q)
Run Code Online (Sandbox Code Playgroud)

并且不存在从 typechar ( * )[10]到 type 的隐式转换char **。所以编译器会报错。

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

char *tmp = p;
mystrcat( &tmp, q );
Run Code Online (Sandbox Code Playgroud)

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

while(**p != '\0')
{
    *p++;
}
Run Code Online (Sandbox Code Playgroud)

因为表达式

*p++
Run Code Online (Sandbox Code Playgroud)

等价于表达式

*( p++ )
Run Code Online (Sandbox Code Playgroud)

当你需要表达的时候

( *p )++
Run Code Online (Sandbox Code Playgroud)

或者

++*p
Run Code Online (Sandbox Code Playgroud)

或者最后一个语句应该是

**p = '\0';
Run Code Online (Sandbox Code Playgroud)

代替

*p = '\0';
Run Code Online (Sandbox Code Playgroud)

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

char * strcat(char * restrict s1, const char * restrict s2);
Run Code Online (Sandbox Code Playgroud)

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

所以该函数可以如下所示

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

    while ( *s ) ++s;

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

    return p;
}
Run Code Online (Sandbox Code Playgroud)

并被称为像

puts( mystrcat( p, q ) );
Run Code Online (Sandbox Code Playgroud)

这是一个演示程序。

#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;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

ravira
Run Code Online (Sandbox Code Playgroud)