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