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

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

我正在尝试实现我的

strcat
版本。但是,我收到以下警告,并且我的代码在运行时崩溃。我从 main 传递
&p
,以对主函数中的变量
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);
}
c pointers c-strings strcat function-definition
3个回答
6
投票

变量

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

将第一个函数参数声明为类型

char **
而不是标准 C 函数
char *
中声明的类型
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

1
投票

不用指向 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; }
    

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)++; }
    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.