我正在尝试实现我的
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);
}
变量
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
不用指向 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)++;
}