通过指针连接两个字符串不起作用
Concat two strings through pointers not working
我创建了一个函数,将字符串 t 连接到字符串 s 的末尾,对于我的练习,我必须为此使用指针,所以我这样做了,但它不起作用:
#include <stdio.h>
void strcat(char *s, char *t)
{
while (*s++);
for (*s = *t; *s = *t; s++, t++);
}
int main()
{
char c[100] = "hello";
char *w = " world\n";
strcat(c, w);
printf(c);
return 0;
}
c 的输出总是 return“你好”而不是“你好world\n”
这个函数内的while循环
while (*s++);
不正确。在 while 循环之后,由于后缀递增运算符,指针 s 指向终止零字符 '[=14=]'
之后。
函数可以通过以下方式声明和定义
char * strcat(char *s, const char *t)
{
char *p = s;
while( *p ) ++p;
while ( ( *p++ = *t++ ) != '[=11=]' );
return s;
}
您还应该重命名该函数,因为 C 中已经有标准的字符串函数 strcat
。
这是一个演示程序。
#include <stdio.h>
char *string_cat( char *s, const char *t )
{
char *p = s;
while (*p) ++p;
while (( *p++ = *t++ ) != '[=12=]');
return s;
}
int main( void )
{
char c[100] = "hello";
const char *w = " world";
puts( string_cat( c, w ) );
}
程序输出为
hello world
另外 好的回答:
Local void strcat(char *s, char *t)
假定 s, t
引用的字符串在内存中不重叠。考虑下面的无限循环 if s == t
.
char *p = s;
while (*p) p++;
while ((*p++ = *t++ ) != 0);
标准 C 库有 char *strcat(char * restrict s1, const char * restrict s2);
。 restrict
假定不重叠并发出可能更好的代码>否则会导致 未定义的行为 (UB)。 OP的代码也应该使用restrict
.
但是我们想要做什么 strcat()
并应对重叠?
// Allow strings refenced by s,t to overlap.
char *my_strcat(char *s1, const char *s2) {
size_t s1len = strlen(s1);
size_t s2siz = strlen(s2) + 1u;
memmove(s1 + s1len, s2, s2siz);
return s1;
}
int main(void) {
char c[100] = "hello";
const char *w = c; //" world";
puts(my_strcat(c, w));
}
输出
hellohello
为了处理重叠,需要额外的工作来确定 s2
的大小。
我创建了一个函数,将字符串 t 连接到字符串 s 的末尾,对于我的练习,我必须为此使用指针,所以我这样做了,但它不起作用:
#include <stdio.h>
void strcat(char *s, char *t)
{
while (*s++);
for (*s = *t; *s = *t; s++, t++);
}
int main()
{
char c[100] = "hello";
char *w = " world\n";
strcat(c, w);
printf(c);
return 0;
}
c 的输出总是 return“你好”而不是“你好world\n”
这个函数内的while循环
while (*s++);
不正确。在 while 循环之后,由于后缀递增运算符,指针 s 指向终止零字符 '[=14=]'
之后。
函数可以通过以下方式声明和定义
char * strcat(char *s, const char *t)
{
char *p = s;
while( *p ) ++p;
while ( ( *p++ = *t++ ) != '[=11=]' );
return s;
}
您还应该重命名该函数,因为 C 中已经有标准的字符串函数 strcat
。
这是一个演示程序。
#include <stdio.h>
char *string_cat( char *s, const char *t )
{
char *p = s;
while (*p) ++p;
while (( *p++ = *t++ ) != '[=12=]');
return s;
}
int main( void )
{
char c[100] = "hello";
const char *w = " world";
puts( string_cat( c, w ) );
}
程序输出为
hello world
另外
Local void strcat(char *s, char *t)
假定 s, t
引用的字符串在内存中不重叠。考虑下面的无限循环 if s == t
.
char *p = s;
while (*p) p++;
while ((*p++ = *t++ ) != 0);
标准 C 库有 char *strcat(char * restrict s1, const char * restrict s2);
。 restrict
假定不重叠并发出可能更好的代码>否则会导致 未定义的行为 (UB)。 OP的代码也应该使用restrict
.
但是我们想要做什么 strcat()
并应对重叠?
// Allow strings refenced by s,t to overlap.
char *my_strcat(char *s1, const char *s2) {
size_t s1len = strlen(s1);
size_t s2siz = strlen(s2) + 1u;
memmove(s1 + s1len, s2, s2siz);
return s1;
}
int main(void) {
char c[100] = "hello";
const char *w = c; //" world";
puts(my_strcat(c, w));
}
输出
hellohello
为了处理重叠,需要额外的工作来确定 s2
的大小。