问题描述
我正在尝试实现我的 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)++;
}