Rav*_*avi 3 c pointers c-strings strcat function-definition
我正在尝试实现我的版本strcat。但是,我收到以下警告,并且我的代码在运行时崩溃。我正在传递&p对main函数p中的变量进行永久更改main。
警告:
\nnote: expected \xe2\x80\x98char **\xe2\x80\x99 but argument is of type \xe2\x80\x98char (*)[10]\xe2\x80\x99\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n
该变量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)
| 归档时间: |
|
| 查看次数: |
11321 次 |
| 最近记录: |